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?