https://gcc.gnu.org/bugzilla/show_bug.cgi?id=72827
--- Comment #24 from Bill Schmidt <wschmidt at gcc dot gnu.org> --- This seems to work as a short-term solution (c,c++,ada bootstrap succeeds). Need to do a full regstrap with all the languages. Index: gcc/config/rs6000/rs6000.c =================================================================== --- gcc/config/rs6000/rs6000.c (revision 239871) +++ gcc/config/rs6000/rs6000.c (working copy) @@ -24506,15 +24506,31 @@ rs6000_split_multireg_move (rtx dst, rtx src) && REG_P (basereg) && REG_P (offsetreg) && REGNO (basereg) != REGNO (offsetreg)); - if (REGNO (basereg) == 0) + /* We mustn't modify the stack pointer or frame pointer + as this will confuse dead store elimination. */ + if ((REGNO (basereg) == STACK_POINTER_REGNUM + || REGNO (basereg) == HARD_FRAME_POINTER_REGNUM) + && REGNO (offsetreg) != 0) { - rtx tmp = offsetreg; - offsetreg = basereg; - basereg = tmp; + emit_insn (gen_add3_insn (offsetreg, basereg, + offsetreg)); + restore_basereg = gen_sub3_insn (offsetreg, offsetreg, + basereg); + dst = replace_equiv_address (dst, offsetreg); } - emit_insn (gen_add3_insn (basereg, basereg, offsetreg)); - restore_basereg = gen_sub3_insn (basereg, basereg, offsetreg); - dst = replace_equiv_address (dst, basereg); + else + { + 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); + } } } else if (GET_CODE (XEXP (dst, 0)) != LO_SUM)