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?

Reply via email to