https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109009
--- Comment #2 from Surya Kumari Jangala <jskumari at gcc dot gnu.org> --- For the working testcase: long foo (long i, long cond) { if (cond) bar (); return i; } The input RTL to the shrink wrap pass is: BB2: set r100, compare(r4, 0) if r100 jump BB4 else jump BB3 BB3: set mem(r1+32), r3 call bar() set r3, mem(r1+32) BB4: return r3 The shrink wrap pass concludes that only BB3 requires a prolog and successfully does shrink wrapping. For the non-working case: long foo (long i, long cond) { if (cond) bar (); return i+1; } The input rtl to the shrink wrap pass is: BB2: set r100, compare(r4, 0) set r31, r3 if r100 jump BB4 else jump BB3 BB3: call bar() BB4: set r3, r31+1 return r3 The shrink wrap pass decides that both BB2 and BB3 require a prolog, and finally the prolog is placed in BB2. Thus shrink wrapping fails for this test.