https://gcc.gnu.org/bugzilla/show_bug.cgi?id=72827
--- Comment #19 from Bill Schmidt <wschmidt at gcc dot gnu.org> ---
I'm suspicious of rs6000_split_multireg_move in rs6000.c, which appears to be
the code that gets called to split a TImode move involving a GPR pair.
In particular, this code:
else
{
rtx basereg = XEXP (XEXP (dst, 0), 0);
rtx offsetreg = XEXP (XEXP (dst, 0), 1);
gcc_assert (GET_CODE (XEXP (dst, 0)) == PLUS
&& REG_P (basereg)
&& REG_P (offsetreg)
&& REGNO (basereg) != REGNO (offsetreg));
if (REGNO (basereg) == 0)
{
rtx tmp = offsetreg;
offsetreg = basereg;
basereg = tmp;
}
emit_insn (gen_add3_insn (basereg, basereg, offsetreg));
restore_basereg = gen_sub3_insn (basereg, basereg,
offsetreg)\
;
dst = replace_equiv_address (dst, basereg);
}
(Later on, restore_basereg is used to put the basereg back where it was before.
This looks exactly like the case we're seeing.)
I don't think we should allow going through this logic if basereg is the stack
pointer or the frame pointer. Mike, what do you think?