[RS6000] secondary_reload and find_replacement
authorAlan Modra <amodra@gmail.com>
Tue, 13 Nov 2018 03:55:30 +0000 (14:25 +1030)
committerAlan Modra <amodra@gcc.gnu.org>
Tue, 13 Nov 2018 03:55:30 +0000 (14:25 +1030)
This patch removes a call only necessary when using reload.  It also
corrects a PRE_DEC address offset.

* config/rs6000/rs6000.c (rs6000_secondary_reload_inner): Negate
offset for PRE_DEC.
(rs6000_secondary_reload_gpr): Don't call find_replacement.

From-SVN: r266049

gcc/ChangeLog
gcc/config/rs6000/rs6000.c

index 34b0726d35658ddcce89e9fa999379bb9fc12a49..3f98c9001f4d0525fde145b6f0b1037a4337693a 100644 (file)
@@ -1,3 +1,9 @@
+2018-11-13  Alan Modra  <amodra@gmail.com>
+
+       * config/rs6000/rs6000.c (rs6000_secondary_reload_inner): Negate
+       offset for PRE_DEC.
+       (rs6000_secondary_reload_gpr): Don't call find_replacement.
+
 2018-11-13  Sandra Loosemore  <sandra@codesourcery.com>
 
        PR middle-end/59634
index e0b1bbb4afb17c82765cdd8b89dd7d1df505e5aa..516e69724cc26fea788c392f467a5fa1648a0c63 100644 (file)
@@ -19701,7 +19701,10 @@ rs6000_secondary_reload_inner (rtx reg, rtx mem, rtx scratch, bool store_p)
 
       if ((addr_mask & RELOAD_REG_PRE_INCDEC) == 0)
        {
-         emit_insn (gen_add2_insn (op_reg, GEN_INT (GET_MODE_SIZE (mode))));
+         int delta = GET_MODE_SIZE (mode);
+         if (GET_CODE (addr) == PRE_DEC)
+           delta = -delta;
+         emit_insn (gen_add2_insn (op_reg, GEN_INT (delta)));
          new_addr = op_reg;
        }
       break;
@@ -19901,17 +19904,6 @@ rs6000_secondary_reload_gpr (rtx reg, rtx mem, rtx scratch, bool store_p)
                  && GET_CODE (XEXP (addr, 1)) == PLUS
                  && XEXP (XEXP (addr, 1), 0) == XEXP (addr, 0));
       scratch_or_premodify = XEXP (addr, 0);
-      if (!HARD_REGISTER_P (scratch_or_premodify))
-       /* If we have a pseudo here then reload will have arranged
-          to have it replaced, but only in the original insn.
-          Use the replacement here too.  */
-       scratch_or_premodify = find_replacement (&XEXP (addr, 0));
-
-      /* RTL emitted by rs6000_secondary_reload_gpr uses RTL
-        expressions from the original insn, without unsharing them.
-        Any RTL that points into the original insn will of course
-        have register replacements applied.  That is why we don't
-        need to look for replacements under the PLUS.  */
       addr = XEXP (addr, 1);
     }
   gcc_assert (GET_CODE (addr) == PLUS || GET_CODE (addr) == LO_SUM);