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>
PR target/42891
......
......@@ -1510,6 +1510,8 @@ cgraph_decide_inlining_incrementally (struct cgraph_node *node,
/* Never inline regular functions into always-inline functions
during incremental inlining. */
&& !node->local.disregard_inline_limits)
{
bitmap visited = BITMAP_ALLOC (NULL);
for (e = node->callees; e; e = e->next_callee)
{
int allowed_growth = 0;
......@@ -1517,6 +1519,10 @@ cgraph_decide_inlining_incrementally (struct cgraph_node *node,
|| !e->inline_failed
|| e->callee->local.disregard_inline_limits)
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)
fprintf (dump_file, "Considering inline candidate %s.\n",
cgraph_node_name (e->callee));
......@@ -1535,7 +1541,8 @@ cgraph_decide_inlining_incrementally (struct cgraph_node *node,
if (dump_file)
{
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;
}
......@@ -1544,9 +1551,9 @@ cgraph_decide_inlining_incrementally (struct cgraph_node *node,
&& optimize_function_for_speed_p (cfun))
allowed_growth = PARAM_VALUE (PARAM_EARLY_INLINING_INSNS);
/* When the function body would grow and inlining the function won't
eliminate the need for offline copy of the function, don't inline.
*/
/* When the function body would grow and inlining the function
won't eliminate the need for offline copy of the function,
don't inline. */
if (((mode == INLINE_SIZE || mode == INLINE_SIZE_NORECURSIVE)
|| (!flag_inline_functions
&& !DECL_DECLARED_INLINE_P (e->callee->decl)))
......@@ -1601,6 +1608,8 @@ cgraph_decide_inlining_incrementally (struct cgraph_node *node,
if (cgraph_default_inline_p (e->callee, &failed_reason))
inlined |= try_inline (e, mode, depth);
}
BITMAP_FREE (visited);
}
node->aux = (void *)(size_t) old_mode;
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