https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64160
Ulrich Weigand <uweigand at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |uweigand at gcc dot gnu.org
--- Comment #1 from Ulrich Weigand <uweigand at gcc dot gnu.org> ---
This is not a reload problem, it's a bug in the addsi3 splitter where it
doesn't account for overlapping source and destination. We have initially:
(insn 11 10 12 2 (set (reg:SI 13 R13)
(plus:SI (reg:SI 12 R12)
(mem:SI (reg/v/f:HI 28 [ ap ]) [2 ap_4(D)->duration+0 S4 A16])))
bug.i:10 20 {addsi3}
(expr_list:REG_DEAD (reg:HI 12 R12)
(nil)))
Note where the destination (reg:SI 13) partially overlaps the source (reg:SI
12).
After split 1 we have:
(insn 22 10 23 2 (parallel [
(set (reg:HI 13 R13)
(plus:HI (reg:HI 12 R12)
(mem:HI (reg/v/f:HI 28 [ ap ]) [2 ap_4(D)->duration+0 S2
A16])))
(set (reg:BI 2 R2)
(truncate:BI (lshiftrt:SI (plus:SI (zero_extend:SI (reg:HI 12
R12))
(zero_extend:SI (mem:HI (reg/v/f:HI 28 [ ap ]) [2
ap_4(D)->duration+0 S2 A16])))
(const_int 16 [0x10]))))
]) bug.i:10 -1
(nil))
(insn 23 22 12 2 (set (reg:HI 14 R14 [+2 ])
(plus:HI (plus:HI (reg:HI 13 R13 [+2 ])
(mem:HI (plus:HI (reg/v/f:HI 28 [ ap ])
(const_int 2 [0x2])) [2 ap_4(D)->duration+2 S2 A16]))
(zero_extend:HI (reg:BI 2 R2)))) bug.i:10 -1
(nil))
Note how the first insn of the pair now clobbers the part of the source that is
still needed for the second half.