re PR target/36780 (Wrong reload generated for subreg address on SH)
authorKaz Kojima <kkojima@gcc.gnu.org>
Tue, 15 Jul 2008 13:06:32 +0000 (13:06 +0000)
committerKaz Kojima <kkojima@gcc.gnu.org>
Tue, 15 Jul 2008 13:06:32 +0000 (13:06 +0000)
PR target/36780
* config/sh/sh.h (GO_IF_LEGITIMATE_ADDRESS): Allow
(plus (plus (reg) (const_int)) (const_int)) when reload_in_progress.

From-SVN: r137838

gcc/ChangeLog
gcc/config/sh/sh.h

index e0ce324800ff473d51b2dfbd7e89b1b62a8db7bd..b4df1d50e8c6c1f9f94de594dedf4ae658be9f8a 100644 (file)
@@ -1,3 +1,9 @@
+2008-07-15  Kaz Kojima  <kkojima@gcc.gnu.org>
+
+       PR target/36780
+       * config/sh/sh.h (GO_IF_LEGITIMATE_ADDRESS): Allow
+       (plus (plus (reg) (const_int)) (const_int)) when reload_in_progress.
+
 2008-07-15  Andrew Pinski  <andrew_pinski@playstation.sony.com>
 
        PR target/31568
index 5204847abc5d2e90fada3c23252e5aefa91d911a..f8b798d327ced5923120f3a53d79183b03ac985c 100644 (file)
@@ -2501,6 +2501,19 @@ struct sh_args {
            goto LABEL;                                                 \
        }                                                               \
     }                                                                  \
+  /* FIXME: This is a temporary hack which should be removed.          \
+     When reload in progress, find_reloads_subreg_address tries to     \
+     make a new reload for some types of address.  Unfortunately it    \
+     generates wrong code on SH.  See PR36780.  The following is to    \
+     avoid this issue.  */                                             \
+  if (!TARGET_SHMEDIA && reload_in_progress                            \
+      && GET_CODE (X) == PLUS                                          \
+      && (GET_MODE_SIZE (MODE) == 4 || GET_MODE_SIZE (MODE) == 8)      \
+      && GET_CODE (XEXP ((X), 0)) == PLUS                              \
+      && GET_CODE (XEXP (XEXP ((X), 0), 1)) == CONST_INT               \
+      && BASE_REGISTER_RTX_P (XEXP (XEXP ((X), 0), 0))                 \
+      && GET_CODE (XEXP ((X), 1)) == CONST_INT)                                \
+    goto LABEL;                                                                \
 }
 \f
 /* Try machine-dependent ways of modifying an illegitimate address