------- Comment #12 from hubicka at gcc dot gnu dot org  2009-02-02 16:35 
-------
try_inline should not recurse when edge is already inlined.  The following
patch should fix the problem, I will benchmark it tonight
Index: ipa-inline.c
===================================================================
--- ipa-inline.c        (revision 143680)
+++ ipa-inline.c        (working copy)
@@ -1330,16 +1330,18 @@ try_inline (struct cgraph_edge *e, enum 
               cgraph_node_name (e->caller));
     }
   if (e->inline_failed)
-    cgraph_mark_inline (e);
+    {
+      cgraph_mark_inline (e);

-  /* In order to fully inline always_inline functions, we need to
-     recurse here, since the inlined functions might not be processed by
-     incremental inlining at all yet.  
+      /* In order to fully inline always_inline functions, we need to
+        recurse here, since the inlined functions might not be processed by
+        incremental inlining at all yet.  

-     Also flattening needs to be done recursively.  */
+        Also flattening needs to be done recursively.  */

-  if (mode == INLINE_ALL || always_inline)
-    cgraph_decide_inlining_incrementally (e->callee, mode, depth + 1);
+      if (mode == INLINE_ALL || always_inline)
+       cgraph_decide_inlining_incrementally (e->callee, mode, depth + 1);
+    }
   callee->aux = (void *)(size_t) callee_mode;
   return true;
 }


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=38844

Reply via email to