ipa-inline.c (recursive_inlining): Redirect to master clone before testing profitability.

* ipa-inline.c (recursive_inlining): Redirect to master
	clone before testing profitability.

From-SVN: r192807
This commit is contained in:
Jan Hubicka 2012-10-25 14:23:08 +02:00 committed by Jan Hubicka
parent 43a8f1a1c3
commit 6ced940d17
2 changed files with 30 additions and 6 deletions

View File

@ -1,3 +1,8 @@
2012-10-25 Jan Hubicka <jh@suse.cz>
* ipa-inline.c (recursive_inlining): Redirect to master
clone before testing profitability.
2012-10-25 Richard Biener <rguenther@suse.de>
PR tree-optimization/54902

View File

@ -1190,14 +1190,28 @@ recursive_inlining (struct cgraph_edge *edge,
{
struct cgraph_edge *curr
= (struct cgraph_edge *) fibheap_extract_min (heap);
struct cgraph_node *cnode;
if (estimate_size_after_inlining (node, curr) > limit)
break;
struct cgraph_node *cnode, *dest = curr->callee;
if (!can_inline_edge_p (curr, true))
continue;
/* MASTER_CLONE is produced in the case we already started modified
the function. Be sure to redirect edge to the original body before
estimating growths otherwise we will be seeing growths after inlining
the already modified body. */
if (master_clone)
{
cgraph_redirect_edge_callee (curr, master_clone);
reset_edge_growth_cache (curr);
}
if (estimate_size_after_inlining (node, curr) > limit)
{
cgraph_redirect_edge_callee (curr, dest);
reset_edge_growth_cache (curr);
break;
}
depth = 1;
for (cnode = curr->caller;
cnode->global.inlined_to; cnode = cnode->callers->caller)
@ -1206,7 +1220,11 @@ recursive_inlining (struct cgraph_edge *edge,
depth++;
if (!want_inline_self_recursive_call_p (curr, node, false, depth))
continue;
{
cgraph_redirect_edge_callee (curr, dest);
reset_edge_growth_cache (curr);
continue;
}
if (dump_file)
{
@ -1228,9 +1246,10 @@ recursive_inlining (struct cgraph_edge *edge,
for (e = master_clone->callees; e; e = e->next_callee)
if (!e->inline_failed)
clone_inlined_nodes (e, true, false, NULL);
cgraph_redirect_edge_callee (curr, master_clone);
reset_edge_growth_cache (curr);
}
cgraph_redirect_edge_callee (curr, master_clone);
inline_call (curr, false, new_edges, &overall_size, true);
lookup_recursive_calls (node, curr->callee, heap);
n++;