https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94042
--- Comment #21 from Martin Liška <marxin at gcc dot gnu.org> --- (In reply to Andrew Pinski from comment #20) > The return value of the first _Z11tsubst_exprP9tree_nodeS0_iS0_b.part.0 was > being copied into r8 and then copied back into r3 (return value), but not r0 > is used and that r0 is used for mtlr (moving back the return address). Yes, I can confirm the $r0 is screwed. The value is equal in good/bad binary at the beginning of the function: (gdb) p /x $r0 $37 = 0x1049a3dc good code stores: 0x104c9124 <._Z19tsubst_template_argP9tree_nodeS0_iS0_+100> std r0,144(r1) (gdb) p /x $r0 $38 = 0x104c9294 but the wrong one into a different memory address: (gdb) p /x $r0 $28 = 0x104c92a4 So yes, $r0 is used first here in bad version here: │0x104c90f4 <._Z19tsubst_template_argP9tree_nodeS0_iS0_+52> ld r0,0(r9)