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)