re PR target/36780 (Wrong reload generated for subreg address on SH)
authorJoseph Myers <joseph@codesourcery.com>
Sat, 19 Jul 2008 11:14:13 +0000 (12:14 +0100)
committerJoseph Myers <jsm28@gcc.gnu.org>
Sat, 19 Jul 2008 11:14:13 +0000 (12:14 +0100)
PR target/36780
PR target/36827
* reload.c (find_reloads_subreg_address): Only reload address if
reloaded == 0, not for reloaded != 1.

Revert:
2008-07-16  Joseph Myers  <joseph@codesourcery.com>
* config/m32c/m32c.c (BIG_FB_ADJ): Move definition earlier.
(m32c_legitimate_address_p): Handle "++rii" addresses created by
m32c_legitimize_reload_address.

2008-07-15  Kaz Kojima  <kkojima@gcc.gnu.org>
* config/sh/sh.h (GO_IF_LEGITIMATE_ADDRESS): Allow
(plus (plus (reg) (const_int)) (const_int)) when reload_in_progress.

From-SVN: r137976

gcc/ChangeLog
gcc/config/m32c/m32c.c
gcc/config/sh/sh.h
gcc/reload.c

index d552bab2b82065f7c34bccbeed795b506930af71..4464f1190e78665d7049b74bf99661f3d8232211 100644 (file)
@@ -1,3 +1,20 @@
+2008-07-19  Joseph Myers  <joseph@codesourcery.com>
+
+       PR target/36780
+       PR target/36827
+       * reload.c (find_reloads_subreg_address): Only reload address if
+       reloaded == 0, not for reloaded != 1.
+
+       Revert:
+       2008-07-16  Joseph Myers  <joseph@codesourcery.com>
+       * config/m32c/m32c.c (BIG_FB_ADJ): Move definition earlier.
+       (m32c_legitimate_address_p): Handle "++rii" addresses created by
+       m32c_legitimize_reload_address.
+
+       2008-07-15  Kaz Kojima  <kkojima@gcc.gnu.org>
+       * config/sh/sh.h (GO_IF_LEGITIMATE_ADDRESS): Allow
+       (plus (plus (reg) (const_int)) (const_int)) when reload_in_progress.
+
 2008-07-19  Olivier Hainque  <hainque@adacore.com>
 
        * dwarf2out.c (add_subscript_info): New explicit COLLAPSE_P
index ef6ba16b5a92b4426ecc12d4d8fa8ce79eba6636..b0733dd83645c79679590bc14440cf1a2184eea2 100644 (file)
@@ -1778,8 +1778,6 @@ m32c_init_libfuncs (void)
 
 /* Addressing Modes */
 
-#define BIG_FB_ADJ 0
-
 /* Used by GO_IF_LEGITIMATE_ADDRESS.  The r8c/m32c family supports a
    wide range of non-orthogonal addressing modes, including the
    ability to double-indirect on *some* of them.  Not all insns
@@ -1897,17 +1895,6 @@ m32c_legitimate_address_p (enum machine_mode mode, rtx x, int strict)
          return 0;
        }
     }
-  if (RTX_IS ("++rii"))
-    {
-      rtx reg = patternr[2];
-      HOST_WIDE_INT offs = INTVAL (patternr[3]);
-
-      /* Avoid reloads for addresses generated by
-        m32c_legitimize_reload_address being generated by
-        find_reloads_subreg_address.  */
-      if (REGNO (reg) == FB_REGNO && offs == -BIG_FB_ADJ)
-       return 1;
-    }
   return 0;
 }
 
@@ -1955,6 +1942,8 @@ m32c_reg_ok_for_base_p (rtx x, int strict)
    frame, so the third case seems best.  Note that we subtract the
    zero, but detect that in the addhi3 pattern.  */
 
+#define BIG_FB_ADJ 0
+
 /* Implements LEGITIMIZE_ADDRESS.  The only address we really have to
    worry about is frame base offsets, as $fb has a limited
    displacement range.  We deal with this by attempting to reload $fb
index f8b798d327ced5923120f3a53d79183b03ac985c..5204847abc5d2e90fada3c23252e5aefa91d911a 100644 (file)
@@ -2501,19 +2501,6 @@ 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
index a391c457191848ec6b694b9a700662cc2f767477..a6ea4ff4e5a2c73c47b0f7e800ffea15cb113853 100644 (file)
@@ -6103,7 +6103,7 @@ find_reloads_subreg_address (rtx x, int force_replace, int opnum,
                 doesn't find any, then we may have just converted a
                 valid address into an invalid one.  Check for that
                 here.  */
-             if (reloaded != 1
+             if (reloaded == 0
                  && !strict_memory_address_p (GET_MODE (tem),
                                               XEXP (tem, 0)))
                push_reload (XEXP (tem, 0), NULL_RTX, &XEXP (tem, 0), (rtx*) 0,