reload.c (find_reloads_subreg_address): Do not require validity of address in origina...
authorJoseph Myers <joseph@codesourcery.com>
Tue, 8 Jul 2008 20:23:56 +0000 (21:23 +0100)
committerJoseph Myers <jsm28@gcc.gnu.org>
Tue, 8 Jul 2008 20:23:56 +0000 (21:23 +0100)
* reload.c (find_reloads_subreg_address): Do not require validity
of address in original mode before reloading address.

From-SVN: r137639

gcc/ChangeLog
gcc/reload.c

index 64888e9412d44e9b863614aa76fa80280e0f9550..5ba91fc8e35881a65212cdcc3cde964c067a23fc 100644 (file)
@@ -1,3 +1,8 @@
+2008-07-08  Joseph Myers  <joseph@codesourcery.com>
+
+       * reload.c (find_reloads_subreg_address): Do not require validity
+       of address in original mode before reloading address.
+
 2008-07-07  Tianwei Sheng  <tianweis@google.com>
 
        * df-core.c (df_remove_problem): Adjust the access to avoid out of
index e426d3634f652df18a48d246daf391817f2c9524..5a128f9fb81b97e0d722e498e76493f94e4d0bb9 100644 (file)
@@ -6049,7 +6049,6 @@ find_reloads_subreg_address (rtx x, int force_replace, int opnum,
              unsigned inner_size = GET_MODE_SIZE (GET_MODE (SUBREG_REG (x)));
              int offset;
              rtx orig = tem;
-             enum machine_mode orig_mode = GET_MODE (orig);
              int reloaded;
 
              /* For big-endian paradoxical subregs, SUBREG_BYTE does not
@@ -6095,7 +6094,9 @@ find_reloads_subreg_address (rtx x, int force_replace, int opnum,
              /* For some processors an address may be valid in the
                 original mode but not in a smaller mode.  For
                 example, ARM accepts a scaled index register in
-                SImode but not in HImode.  find_reloads_address
+                SImode but not in HImode.  Similarly, the address may
+                have been valid before the subreg offset was added,
+                but not afterwards.  find_reloads_address
                 assumes that we pass it a valid address, and doesn't
                 force a reload.  This will probably be fine if
                 find_reloads_address finds some reloads.  But if it
@@ -6103,7 +6104,6 @@ find_reloads_subreg_address (rtx x, int force_replace, int opnum,
                 valid address into an invalid one.  Check for that
                 here.  */
              if (reloaded != 1
-                 && strict_memory_address_p (orig_mode, XEXP (tem, 0))
                  && !strict_memory_address_p (GET_MODE (tem),
                                               XEXP (tem, 0)))
                push_reload (XEXP (tem, 0), NULL_RTX, &XEXP (tem, 0), (rtx*) 0,