reload.c (find_reloads_toplev): Reload a paradoxical subreg of a mem if the address...
authorHans-Peter Nilsson <hp@axis.com>
Thu, 27 Jul 2000 01:45:41 +0000 (01:45 +0000)
committerJeff Law <law@gcc.gnu.org>
Thu, 27 Jul 2000 01:45:41 +0000 (19:45 -0600)
        * reload.c (find_reloads_toplev): Reload a paradoxical subreg of a
        mem if the address is a mode_dependent_address_p.

From-SVN: r35280

gcc/ChangeLog
gcc/reload.c

index 61f1e389285522eb77274b69a773e5391c1f230b..2ee5949ab066188dbc27b84be83f944f6bc1a74d 100644 (file)
@@ -1,3 +1,8 @@
+Wed Jul 26 19:44:05 2000   Hans-Peter Nilsson  <hp@axis.com>
+
+       * reload.c (find_reloads_toplev): Reload a paradoxical subreg of a
+       mem if the address is a mode_dependent_address_p.
+
 2000-07-26  Kazu Hirata  <kazu@hxi.com>
 
        * h8300.c (print_operand): Print ":8" when the 'R' operand is
index f6621d8e6f7dc472683d97c09dee605316b7082b..d519708408e7c67fa22114738bc1f351d54b164d 100644 (file)
@@ -4335,6 +4335,25 @@ find_reloads_toplev (x, opnum, type, ind_levels, is_set_dest, insn,
        x = find_reloads_subreg_address (x, 1, opnum, type, ind_levels,
                                         insn);
     }
+  else if (code == SUBREG && GET_CODE (SUBREG_REG (x)) == MEM
+          && (GET_MODE_SIZE (GET_MODE (x))
+              > GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))))
+          && mode_dependent_address_p (XEXP (SUBREG_REG (x), 0)))
+    {
+      /* A paradoxical subreg will simply have the mode of the access
+        changed, so we need to reload such a memory operand to stabilize
+        the meaning of the memory access.  */
+      enum machine_mode subreg_mode = GET_MODE (SUBREG_REG (x));
+
+      if (is_set_dest)
+       push_reload (NULL_RTX, SUBREG_REG (x), NULL_PTR, &SUBREG_REG (x),
+                    find_valid_class (subreg_mode, SUBREG_WORD (x)),
+                    VOIDmode, subreg_mode, 0, 0, opnum, type);
+      else
+       push_reload (SUBREG_REG (x), NULL_RTX, &SUBREG_REG (x), NULL_PTR,
+                    find_valid_class (subreg_mode, SUBREG_WORD (x)),
+                    subreg_mode, VOIDmode, 0, 0, opnum, type);
+    }
 
   for (copied = 0, i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
     {
@@ -5530,7 +5549,7 @@ find_reloads_subreg_address (x, force_replace, opnum, type,
 \f
 /* Substitute into the current INSN the registers into which we have reloaded
    the things that need reloading.  The array `replacements'
-   says contains the locations of all pointers that must be changed
+   contains the locations of all pointers that must be changed
    and says what to replace them with.
 
    Return the rtx that X translates into; usually X, but modified.  */