https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65249
--- Comment #4 from Oleg Endo <olegendo at gcc dot gnu.org> --- For some reason r0 is live throughout the whole basic block where the problem occures. The basic block starts with: (note 36 35 38 5 [bb 5] NOTE_INSN_BASIC_BLOCK) (note 38 36 39 5 NOTE_INSN_DELETED) (note 39 38 70 5 NOTE_INSN_DELETED) (insn 70 39 133 5 (set (reg:SI 0 r0) (const_int 0 [0])) ccdkVmsq_1.out:48 252 {movsi_ie} (nil)) When using LRA, r0 is spilled to stack, and PIC_REG (r12) is copied to r0 for the mem load. r0 is then reloaded from stack, but rematerialized and converted into a load of constant. mov r12,r2 add r11,r2 mov #0,r0 <<<< mov.l .L25,r1 mov.l @r2,r2 mov.l r0,@r15 <<<< mov r12,r0 <<<< mov.l @(60,r10),r3 mov.l @r2,r7 cmp/eq r3,r7 mov #0,r3 mov #0,r7 mov.l @(r0,r1),r1 <<<< bf/s .L16 mov #0,r0 <<<< add #12,r15 ... If I'm not mistaken, the above can be done better as: mov r11,r0 mov.l @(r0,r12),r2 mov.l .L25,r0 mov.l @(60,r10),r3 mov.l @r2,r7 cmp/eq r3,r7 mov #0,r3 mov #0,r7 mov.l @(r0,r12),r1 bf/s .L16 mov #0,r0 add #12,r15 ...