From ea471af0b8ecd3979665da8c74f120963254c5cd Mon Sep 17 00:00:00 2001 From: Joseph Myers Date: Sat, 19 Jul 2008 12:14:13 +0100 Subject: [PATCH] re PR target/36780 (Wrong reload generated for subreg address on SH) 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 * 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 * 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 | 17 +++++++++++++++++ gcc/config/m32c/m32c.c | 15 ++------------- gcc/config/sh/sh.h | 13 ------------- gcc/reload.c | 2 +- 4 files changed, 20 insertions(+), 27 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d552bab2b82..4464f1190e7 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,20 @@ +2008-07-19 Joseph Myers + + 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 + * 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 + * 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 * dwarf2out.c (add_subscript_info): New explicit COLLAPSE_P diff --git a/gcc/config/m32c/m32c.c b/gcc/config/m32c/m32c.c index ef6ba16b5a9..b0733dd8364 100644 --- a/gcc/config/m32c/m32c.c +++ b/gcc/config/m32c/m32c.c @@ -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 diff --git a/gcc/config/sh/sh.h b/gcc/config/sh/sh.h index f8b798d327c..5204847abc5 100644 --- a/gcc/config/sh/sh.h +++ b/gcc/config/sh/sh.h @@ -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; \ } /* Try machine-dependent ways of modifying an illegitimate address diff --git a/gcc/reload.c b/gcc/reload.c index a391c457191..a6ea4ff4e5a 100644 --- a/gcc/reload.c +++ b/gcc/reload.c @@ -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, -- 2.30.2