https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92303
--- Comment #10 from Jakub Jelinek <jakub at gcc dot gnu.org> --- So, quite early during LRA we get: (insn 14 13 18 3 (set (reg:DI 9 %o1) (zero_extend:DI (subreg:SI (mem/c:V8QI (plus:DI (reg/f:DI 101 %sfp) (const_int -8 [0xfffffffffffffff8])) [4 %sfp+-8 S8 A64]) 4))) "ultrasp13.c":23:7 179 {*zero_extendsidi2_insn_sp64} (nil)) (insn 18 14 15 3 (set (reg:DI 111 [ ivtmp.11 ]) (plus:DI (reg:DI 111 [ ivtmp.11 ]) (const_int 8 [0x8]))) "ultrasp13.c":17:3 224 {*adddi3_sp64} (nil)) (insn 15 18 16 3 (set (reg:DI 8 %o0) (zero_extend:DI (subreg:SI (mem/c:V8QI (plus:DI (reg/f:DI 101 %sfp) (const_int -8 [0xfffffffffffffff8])) [4 %sfp+-8 S8 A64]) 0))) "ultrasp13.c":23:7 179 {*zero_extendsidi2_insn_sp64} (expr_list:REG_DEAD (reg/v:V8QI 114 [ v ]) (nil))) It isn't clear why the subreg of the mem isn't folded to a mem/c:SI. Further iteration tries to do: (insn 44 13 45 3 (set (reg:V8QI 126) (mem/c:V8QI (plus:DI (reg/f:DI 101 %sfp) (const_int -8 [0xfffffffffffffff8])) [4 %sfp+-8 S8 A64])) "ultrasp13.c":23:7 470 {*movv8qi_insn_sp64} (nil)) (insn 45 44 14 3 (set (reg:SI 127) (subreg:SI (reg:V8QI 126) 4)) "ultrasp13.c":23:7 116 {*movsi_insn} (expr_list:REG_DEAD (reg:V8QI 126) (nil))) (insn 14 45 18 3 (set (reg:DI 9 %o1) (zero_extend:DI (reg:SI 127))) "ultrasp13.c":23:7 179 {*zero_extendsidi2_insn_sp64} (expr_list:REG_DEAD (reg:SI 127) (nil))) (insn 18 14 42 3 (set (reg:DI 111 [ ivtmp.11 ]) (plus:DI (reg:DI 111 [ ivtmp.11 ]) (const_int 8 [0x8]))) "ultrasp13.c":17:3 224 {*adddi3_sp64} (nil)) (insn 42 18 43 3 (set (reg:V8QI 124) (mem/c:V8QI (plus:DI (reg/f:DI 101 %sfp) (const_int -8 [0xfffffffffffffff8])) [4 %sfp+-8 S8 A64])) "ultrasp13.c":23:7 470 {*movv8qi_insn_sp64} (nil)) (insn 43 42 15 3 (set (reg:SI 125) (subreg:SI (reg:V8QI 124) 0)) "ultrasp13.c":23:7 116 {*movsi_insn} (expr_list:REG_DEAD (reg:V8QI 124) (nil))) (insn 15 43 16 3 (set (reg:DI 8 %o0) (zero_extend:DI (reg:SI 125))) "ultrasp13.c":23:7 179 {*zero_extendsidi2_insn_sp64} (expr_list:REG_DEAD (reg:SI 125) (nil))) and the insn 43 then reloaded into: (insn 46 42 43 3 (set (mem/c:V8QI (plus:DI (reg/f:DI 101 %sfp) (const_int -16 [0xfffffffffffffff0])) [4 %sfp+-16 S8 A64]) (reg:V8QI 124)) "ultrasp13.c":23:7 470 {*movv8qi_insn_sp64} (expr_list:REG_DEAD (reg:V8QI 124) (nil))) (insn 43 46 15 3 (set (reg:SI 125) (subreg:SI (mem/c:V8QI (plus:DI (reg/f:DI 101 %sfp) (const_int -16 [0xfffffffffffffff0])) [4 %sfp+-16 S8 A64]) 0)) "ultrasp13.c":23:7 116 {*movsi_insn} (expr_list:REG_DEAD (reg:V8QI 128 [124]) (nil))) and then (insn 47 46 48 3 (set (reg:V8QI 129) (mem/c:V8QI (plus:DI (reg/f:DI 101 %sfp) (const_int -16 [0xfffffffffffffff0])) [4 %sfp+-16 S8 A64])) "ultrasp13.c":23:7 470 {*movv8qi_insn_sp64} (nil)) (insn 48 47 43 3 (set (reg:SI 130) (subreg:SI (reg:V8QI 129) 0)) "ultrasp13.c":23:7 116 {*movsi_insn} (expr_list:REG_DEAD (reg:V8QI 129) (nil))) (insn 43 48 15 3 (set (reg:SI 125) (reg:SI 130)) "ultrasp13.c":23:7 116 {*movsi_insn} (expr_list:REG_DEAD (reg:SI 130) (nil))) and now we are back at two steps before with insn 48 now being what insn 43 used to be, and like that forever.