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.

Reply via email to