https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87871
--- Comment #15 from Segher Boessenkool <segher at gcc dot gnu.org> --- Forming thread by copy 0:a0r111-a4r117 (freq=500): Result (freq=3500): a0r111(2500) a4r117(1000) Forming thread by copy 2:a3r112-a5r116 (freq=125): Result (freq=4500): a3r112(1500) a5r116(3000) Forming thread by copy 1:a2r114-a3r112 (freq=62): Result (freq=5500): a2r114(1000) a3r112(1500) a5r116(3000) Pushing a1(r113,l0)(cost 0) Pushing a4(r117,l0)(cost 0) Pushing a0(r111,l0)(cost 0) Pushing a2(r114,l0)(cost 0) Pushing a3(r112,l0)(cost 0) Pushing a5(r116,l0)(cost 0) Popping a5(r116,l0) -- assign reg 3 Popping a3(r112,l0) -- assign reg 4 Popping a2(r114,l0) -- assign reg 3 Popping a0(r111,l0) -- assign reg 0 Popping a4(r117,l0) -- assign reg 0 Popping a1(r113,l0) -- assign reg 2 Assigning 4 to a5r116 Disposition: 0:r111 l0 0 3:r112 l0 4 1:r113 l0 2 2:r114 l0 3 5:r116 l0 4 4:r117 l0 0 r116 does not conflict with *any* other pseudo. It is alive in the first two insns of the function, which are (insn 50 3 7 2 (set (reg:SI 116) (reg:SI 0 r0 [ a ])) "ira-shrinkwrap-prep-1.c":14:1 181 {*arm_movsi_insn} (nil)) (insn 7 50 8 2 (parallel [ (set (reg:CC 100 cc) (compare:CC (reg:SI 116) (const_int 0 [0]))) (set (reg/v:SI 112 [ a ]) (reg:SI 116)) ]) "ira-shrinkwrap-prep-1.c":17:6 188 {*movsi_compare0} (expr_list:REG_DEAD (reg:SI 116) (nil))) r0 _is_ used by a successor (as the argument for the call to foo), but we could use r0 for r116 anyway, since what we assign to it is r0 :-)