OSDN Git Service

PR middle-end/47543
authorlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 2 Feb 2011 16:52:21 +0000 (16:52 +0000)
committerlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 2 Feb 2011 16:52:21 +0000 (16:52 +0000)
* reload.c (find_reloads_address): Handle reg+d address where both
components are invalid by reloading the entire address.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@169533 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/reload.c

index 79a140b..67b64a3 100644 (file)
@@ -1,3 +1,9 @@
+2011-02-02  Jeff Law  <law@redhat.com>
+
+       PR middle-end/47543
+       * reload.c (find_reloads_address): Handle reg+d address where both
+       components are invalid by reloading the entire address.
+
 2011-02-02  Sebastian Pop  <sebastian.pop@amd.com>
            Richard Guenther  <rguenther@suse.de>
 
index aa9e68e..714355c 100644 (file)
@@ -5066,8 +5066,13 @@ find_reloads_address (enum machine_mode mode, rtx *memrefloc, rtx ad,
           && REG_P (XEXP (ad, 0))
           && REGNO (XEXP (ad, 0)) < FIRST_PSEUDO_REGISTER
           && CONST_INT_P (XEXP (ad, 1))
-          && regno_ok_for_base_p (REGNO (XEXP (ad, 0)), mode, PLUS,
-                                  CONST_INT))
+          && (regno_ok_for_base_p (REGNO (XEXP (ad, 0)), mode, PLUS,
+                                   CONST_INT)
+              /* Similarly, if we were to reload the base register and the
+                 mem+offset address is still invalid, then we want to reload
+                 the whole address, not just the base register.  */
+              || ! maybe_memory_address_addr_space_p
+                    (mode, ad, as, &(XEXP (ad, 0)))))
 
     {
       /* Unshare the MEM rtx so we can safely alter it.  */
@@ -5079,7 +5084,9 @@ find_reloads_address (enum machine_mode mode, rtx *memrefloc, rtx ad,
            loc = &XEXP (*loc, 0);
        }
 
-      if (double_reg_address_ok)
+      if (double_reg_address_ok
+         && regno_ok_for_base_p (REGNO (XEXP (ad, 0)), mode,
+                                 PLUS, CONST_INT))
        {
          /* Unshare the sum as well.  */
          *loc = ad = copy_rtx (ad);