From 6ced940d172f65be316637f4945fbf633a79ab90 Mon Sep 17 00:00:00 2001 From: Jan Hubicka Date: Thu, 25 Oct 2012 14:23:08 +0200 Subject: [PATCH] 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 --- gcc/ChangeLog | 5 +++++ gcc/ipa-inline.c | 31 +++++++++++++++++++++++++------ 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 59c476fa428..0b8655292a8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2012-10-25 Jan Hubicka + + * ipa-inline.c (recursive_inlining): Redirect to master + clone before testing profitability. + 2012-10-25 Richard Biener PR tree-optimization/54902 diff --git a/gcc/ipa-inline.c b/gcc/ipa-inline.c index f5c255ca0b7..3f9a800b55d 100644 --- a/gcc/ipa-inline.c +++ b/gcc/ipa-inline.c @@ -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++; -- 2.11.4.GIT