+2011-05-01 Jan Hubicka <jh@suse.cz>
+
+ * ipa-inline.c (caller_growth_limits): Fix thinko when
+ looking for largest stack frame.
+ * ipa-inline.h (dump_inline_summary): Declare.
+ * ipa-inline-analysis.c (dump_inline_edge_summary): Dump info
+ on stack usage.
+ (dump_inline_summary): Export.
+ (debug_inline_summary): Declare as DEBUG_FUNCTION.
+
2011-05-01 Anatoly Sokolov <aesok@post.ru>
* reginfo.c (memory_move_cost): Change rclass argument type form
for (edge = node->callees; edge; edge = edge->next_callee)
{
struct inline_edge_summary *es = inline_edge_summary (edge);
- fprintf (f, "%*s%s/%i %s\n%*s loop depth:%2i freq:%4i size:%2i time: %2i",
+ fprintf (f, "%*s%s/%i %s\n%*s loop depth:%2i freq:%4i size:%2i time: %2i callee size:%2i stack:%2i",
indent, "", cgraph_node_name (edge->callee),
edge->callee->uid,
!edge->inline_failed ? "inlined"
es->loop_depth,
edge->frequency,
es->call_stmt_size,
- es->call_stmt_time);
+ es->call_stmt_time,
+ (int)inline_summary (edge->callee)->size,
+ (int)inline_summary (edge->callee)->estimated_stack_size);
if (es->predicate)
{
fprintf (f, " predicate: ");
else
fprintf (f, "\n");
if (!edge->inline_failed)
- dump_inline_edge_summary (f, indent+2, edge->callee, info);
+ {
+ fprintf (f, "%*sStack frame offset %i, callee self size %i, callee size %i\n",
+ indent+2, "",
+ (int)inline_summary (edge->callee)->stack_frame_offset,
+ (int)inline_summary (edge->callee)->estimated_self_stack_size,
+ (int)inline_summary (edge->callee)->estimated_stack_size);
+ dump_inline_edge_summary (f, indent+2, edge->callee, info);
+ }
}
for (edge = node->indirect_calls; edge; edge = edge->next_callee)
{
}
-static void
+void
dump_inline_summary (FILE * f, struct cgraph_node *node)
{
if (node->analyzed)
}
}
-void
+DEBUG_FUNCTION void
debug_inline_summary (struct cgraph_node *node)
{
dump_inline_summary (stderr, node);
we immediately inline to. This is the most relaxed
interpretation of the rule "do not grow large functions
too much in order to prevent compiler from exploding". */
- do
+ while (true)
{
info = inline_summary (to);
if (limit < info->self_size)
stack_size_limit = info->estimated_self_stack_size;
if (to->global.inlined_to)
to = to->callers->caller;
+ else
+ break;
}
- while (to->global.inlined_to);
what_info = inline_summary (what);
return false;
}
+ if (!what_info->estimated_stack_size)
+ return true;
+
/* FIXME: Stack size limit often prevents inlining in Fortran programs
due to large i/o datastructures used by the Fortran front-end.
We ought to ignore this limit when we know that the edge is executed
on every invocation of the caller (i.e. its call statement dominates
exit block). We do not track this information, yet. */
- stack_size_limit += (stack_size_limit
+ stack_size_limit += ((gcov_type)stack_size_limit
* PARAM_VALUE (PARAM_STACK_FRAME_GROWTH) / 100);
inlined_stack = (outer_info->stack_frame_offset
/* In ipa-inline-analysis.c */
void debug_inline_summary (struct cgraph_node *);
void dump_inline_summaries (FILE *f);
+void dump_inline_summary (FILE * f, struct cgraph_node *node);
void inline_generate_summary (void);
void inline_read_summary (void);
void inline_write_summary (cgraph_node_set, varpool_node_set);