ipa-inline.c (recursive_inlining): Redirect to master clone before testing profitability.
authorJan Hubicka <jh@suse.cz>
Thu, 25 Oct 2012 12:23:08 +0000 (14:23 +0200)
committerJan Hubicka <hubicka@gcc.gnu.org>
Thu, 25 Oct 2012 12:23:08 +0000 (12:23 +0000)
* ipa-inline.c (recursive_inlining): Redirect to master
clone before testing profitability.

From-SVN: r192807

gcc/ChangeLog
gcc/ipa-inline.c

index 59c476fa4288a196cd6bf50749dbc0c2369b12b7..0b8655292a86c789f9edb7e90ac1cc0496f3221b 100644 (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
index f5c255ca0b7e16b2f7f5f8a1866a658028b46c06..3f9a800b55d7ce854da9197d494331204f20f366 100644 (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++;