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)

Reply via email to