re PR tree-optimization/26667 (Inlining always_inline functions causes further inlini...
authorRichard Guenther <rguenther@suse.de>
Tue, 14 Mar 2006 09:57:43 +0000 (09:57 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 14 Mar 2006 09:57:43 +0000 (09:57 +0000)
2006-03-14  Richard Guenther  <rguenther@suse.de>

        PR tree-optimization/26667
* ipa-inline.c (cgraph_check_inline_limits): Walk the correct
node for the callees.  Always allow inlining if it will shrink
the function size.

From-SVN: r112049

gcc/ChangeLog
gcc/ipa-inline.c

index 58b6eee21db9bfca5eb6264de025bddcdbd0faa1..63d589b0e7b808ecd2e03292bc72e038ff18c855 100644 (file)
@@ -1,3 +1,10 @@
+2006-03-14  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/26667
+       * ipa-inline.c (cgraph_check_inline_limits): Walk the correct
+       node for the callees.  Always allow inlining if it will shrink
+       the function size.
+
 2006-03-14  Richard Guenther  <rguenther@suse.de>
 
        PR middle-end/26659
index 9ba2f109b3c36d1f2288168f6e00d140e36b6063..4765b00ac9016c7d7e1d090584cf0db120f01963 100644 (file)
@@ -254,13 +254,13 @@ cgraph_check_inline_limits (struct cgraph_node *to, struct cgraph_node *what,
   int newsize;
   int limit;
 
-  if (to->global.inlined_to)
-    to = to->global.inlined_to;
-
   for (e = to->callees; e; e = e->next_callee)
     if (e->callee == what)
       times++;
 
+  if (to->global.inlined_to)
+    to = to->global.inlined_to;
+
   /* When inlining large function body called once into small function,
      take the inlined function as base for limiting the growth.  */
   if (to->local.self_insns > what->local.self_insns)
@@ -270,8 +270,11 @@ cgraph_check_inline_limits (struct cgraph_node *to, struct cgraph_node *what,
 
   limit += limit * PARAM_VALUE (PARAM_LARGE_FUNCTION_GROWTH) / 100;
 
+  /* Check the size after inlining against the function limits.  But allow
+     the function to shrink if it went over the limits by forced inlining.  */
   newsize = cgraph_estimate_size_after_inlining (times, to, what);
-  if (newsize > PARAM_VALUE (PARAM_LARGE_FUNCTION_INSNS)
+  if (newsize >= to->global.insns
+      && newsize > PARAM_VALUE (PARAM_LARGE_FUNCTION_INSNS)
       && newsize > limit)
     {
       if (reason)