------- Comment #11 from jamborm at gcc dot gnu dot org 2009-07-29 13:40 ------- (In reply to comment #8) > That only detects direct loops, does it?
Actually, now I may understand but no, it is exactly the other way round. The patch above only detects indirect loops, when there are at least two nodes involved. But that is not necessarily true, as I have just discovered the hard way when testing my ipa-cp stuff... The updated patch which I am going to test now therefore is: 2009-07-30 Martin Jambor <mjam...@suse.cz> * ipa-inline.c (cgraph_decide_inlining): Watch out for dead single use inlining loops. * testsuite/gcc.c-torture/compile/pr40570.c: New test. Index: icln/gcc/ipa-inline.c =================================================================== --- icln.orig/gcc/ipa-inline.c +++ icln/gcc/ipa-inline.c @@ -1227,6 +1227,8 @@ cgraph_decide_inlining (void) && !node->needed && node->local.inlinable && node->callers->inline_failed + && node->callers->caller != node + && node->callers->caller->global.inlined_to != node && !gimple_call_cannot_inline_p (node->callers->call_stmt) && !DECL_EXTERNAL (node->decl) && !DECL_COMDAT (node->decl)) Index: icln/gcc/testsuite/gcc.c-torture/compile/pr40570.c =================================================================== --- /dev/null +++ icln/gcc/testsuite/gcc.c-torture/compile/pr40570.c @@ -0,0 +1,19 @@ +static int foo(int i); + +static int bar(int i) { foo(i); } + +static int foo(int i) +{ + int j; + if (j) + FOO(j); + return bar(i); +} + +int baz() +{ + foo(0); + if (baz()) + return 1; + return 0; +} -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40570