https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109009
--- Comment #3 from Surya Kumari Jangala <jskumari at gcc dot gnu.org> --- For the working case: * Input RTL to the IRA pass: BB2: set r123, r4 set r122, r3 set r120, compare(r123, 0) set r118, r122 if r120 jump BB4 else jump BB3 BB3: call bar() BB4: set r3, r118 return * RTL after the IRA pass: same as the input * RTL after reload pass: 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) ----------- For the failing case: * Input RTL to the IRA pass: BB2: set r123, r4 set r122, r3 set r120, compare(r123, 0) set r118, r122 if r120 jump BB4 else jump BB3 BB3: call bar() BB4: set r3, r118+1 return r3 * RTL after IRA pass same as the input * RTL after reload pass 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 -------- After the IRA pass, the IR looks very similar in both the working and failing testcases. But the reload pass produces different IR. The live ranges seem to be properly split after IRA. I will be checking why the reload/LRA pass produces different IR.