Commit 38bc76da by Richard Guenther Committed by Richard Biener

re PR middle-end/37448 (cannot compile big function)

2010-01-29  Richard Guenther  <rguenther@suse.de>

	PR middle-end/37448
	* ipa-inline.c (cgraph_decide_inlining_incrementally): Avoid
	quadratic behavior in most cases.

From-SVN: r156343
parent 9ee5ebeb
2010-01-29 Richard Guenther <rguenther@suse.de>
PR middle-end/37448
* ipa-inline.c (cgraph_decide_inlining_incrementally): Avoid
quadratic behavior in most cases.
2010-01-28 Uros Bizjak <ubizjak@gmail.com> 2010-01-28 Uros Bizjak <ubizjak@gmail.com>
PR target/42891 PR target/42891
......
...@@ -1510,6 +1510,8 @@ cgraph_decide_inlining_incrementally (struct cgraph_node *node, ...@@ -1510,6 +1510,8 @@ cgraph_decide_inlining_incrementally (struct cgraph_node *node,
/* Never inline regular functions into always-inline functions /* Never inline regular functions into always-inline functions
during incremental inlining. */ during incremental inlining. */
&& !node->local.disregard_inline_limits) && !node->local.disregard_inline_limits)
{
bitmap visited = BITMAP_ALLOC (NULL);
for (e = node->callees; e; e = e->next_callee) for (e = node->callees; e; e = e->next_callee)
{ {
int allowed_growth = 0; int allowed_growth = 0;
...@@ -1517,6 +1519,10 @@ cgraph_decide_inlining_incrementally (struct cgraph_node *node, ...@@ -1517,6 +1519,10 @@ cgraph_decide_inlining_incrementally (struct cgraph_node *node,
|| !e->inline_failed || !e->inline_failed
|| e->callee->local.disregard_inline_limits) || e->callee->local.disregard_inline_limits)
continue; continue;
/* We are inlining a function to all call-sites in node
or to none. So visit each candidate only once. */
if (!bitmap_set_bit (visited, e->callee->uid))
continue;
if (dump_file) if (dump_file)
fprintf (dump_file, "Considering inline candidate %s.\n", fprintf (dump_file, "Considering inline candidate %s.\n",
cgraph_node_name (e->callee)); cgraph_node_name (e->callee));
...@@ -1535,7 +1541,8 @@ cgraph_decide_inlining_incrementally (struct cgraph_node *node, ...@@ -1535,7 +1541,8 @@ cgraph_decide_inlining_incrementally (struct cgraph_node *node,
if (dump_file) if (dump_file)
{ {
indent_to (dump_file, depth); indent_to (dump_file, depth);
fprintf (dump_file, "Not inlining: SSA form does not match.\n"); fprintf (dump_file,
"Not inlining: SSA form does not match.\n");
} }
continue; continue;
} }
...@@ -1544,9 +1551,9 @@ cgraph_decide_inlining_incrementally (struct cgraph_node *node, ...@@ -1544,9 +1551,9 @@ cgraph_decide_inlining_incrementally (struct cgraph_node *node,
&& optimize_function_for_speed_p (cfun)) && optimize_function_for_speed_p (cfun))
allowed_growth = PARAM_VALUE (PARAM_EARLY_INLINING_INSNS); allowed_growth = PARAM_VALUE (PARAM_EARLY_INLINING_INSNS);
/* When the function body would grow and inlining the function won't /* When the function body would grow and inlining the function
eliminate the need for offline copy of the function, don't inline. won't eliminate the need for offline copy of the function,
*/ don't inline. */
if (((mode == INLINE_SIZE || mode == INLINE_SIZE_NORECURSIVE) if (((mode == INLINE_SIZE || mode == INLINE_SIZE_NORECURSIVE)
|| (!flag_inline_functions || (!flag_inline_functions
&& !DECL_DECLARED_INLINE_P (e->callee->decl))) && !DECL_DECLARED_INLINE_P (e->callee->decl)))
...@@ -1601,6 +1608,8 @@ cgraph_decide_inlining_incrementally (struct cgraph_node *node, ...@@ -1601,6 +1608,8 @@ cgraph_decide_inlining_incrementally (struct cgraph_node *node,
if (cgraph_default_inline_p (e->callee, &failed_reason)) if (cgraph_default_inline_p (e->callee, &failed_reason))
inlined |= try_inline (e, mode, depth); inlined |= try_inline (e, mode, depth);
} }
BITMAP_FREE (visited);
}
node->aux = (void *)(size_t) old_mode; node->aux = (void *)(size_t) old_mode;
return inlined; return inlined;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment