diff options
author | Eric Botcazou <ebotcazou@libertysurf.fr> | 2003-03-26 08:48:15 +0100 |
---|---|---|
committer | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2003-03-26 07:48:15 +0000 |
commit | 27e484bc572d80b8862f96bf0b9529e955afafac (patch) | |
tree | 8d96699feab644c4819e1ad2ab11cbb406364b27 /gcc/reload.c | |
parent | 72eb6d424130d9556d49dada6d769e32b2d49bbe (diff) | |
download | gcc-27e484bc572d80b8862f96bf0b9529e955afafac.zip gcc-27e484bc572d80b8862f96bf0b9529e955afafac.tar.gz gcc-27e484bc572d80b8862f96bf0b9529e955afafac.tar.bz2 |
re PR target/7784 ([Sparc] ICE in extract_insn, at recog.c:2148)
PR target/7784
* reload.c (find_reloads_address): Handle
(PLUS (PLUS (REG) (REG)) (CONST_INT)) form for
all base registers.
From-SVN: r64887
Diffstat (limited to 'gcc/reload.c')
-rw-r--r-- | gcc/reload.c | 35 |
1 files changed, 14 insertions, 21 deletions
diff --git a/gcc/reload.c b/gcc/reload.c index de1b1a9..e360e26 100644 --- a/gcc/reload.c +++ b/gcc/reload.c @@ -4890,25 +4890,23 @@ find_reloads_address (mode, memrefloc, ad, loc, opnum, type, ind_levels, insn) that the index needs a reload and find_reloads_address_1 will take care of it. - If we decide to do something here, it must be that - `double_reg_address_ok' is true and that this address rtl was made by - eliminate_regs. We generate a reload of the fp/sp/ap + constant and + Handle all base registers here, not just fp/ap/sp, because on some + targets (namely Sparc) we can also get invalid addresses from preventive + subreg big-endian corrections made by find_reloads_toplev. + + If we decide to do something, it must be that `double_reg_address_ok' + is true. We generate a reload of the base register + constant and rework the sum so that the reload register will be added to the index. This is safe because we know the address isn't shared. - We check for fp/ap/sp as both the first and second operand of the - innermost PLUS. */ + We check for the base register as both the first and second operand of + the innermost PLUS. */ else if (GET_CODE (ad) == PLUS && GET_CODE (XEXP (ad, 1)) == CONST_INT && GET_CODE (XEXP (ad, 0)) == PLUS - && (XEXP (XEXP (ad, 0), 0) == frame_pointer_rtx -#if FRAME_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM - || XEXP (XEXP (ad, 0), 0) == hard_frame_pointer_rtx -#endif -#if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM - || XEXP (XEXP (ad, 0), 0) == arg_pointer_rtx -#endif - || XEXP (XEXP (ad, 0), 0) == stack_pointer_rtx) + && GET_CODE (XEXP (XEXP (ad, 0), 0)) == REG + && REGNO (XEXP (XEXP (ad, 0), 0)) < FIRST_PSEUDO_REGISTER + && REG_MODE_OK_FOR_BASE_P (XEXP (XEXP (ad, 0), 0), mode) && ! maybe_memory_address_p (mode, ad, &XEXP (XEXP (ad, 0), 1))) { *loc = ad = gen_rtx_PLUS (GET_MODE (ad), @@ -4926,14 +4924,9 @@ find_reloads_address (mode, memrefloc, ad, loc, opnum, type, ind_levels, insn) else if (GET_CODE (ad) == PLUS && GET_CODE (XEXP (ad, 1)) == CONST_INT && GET_CODE (XEXP (ad, 0)) == PLUS - && (XEXP (XEXP (ad, 0), 1) == frame_pointer_rtx -#if HARD_FRAME_POINTER_REGNUM != FRAME_POINTER_REGNUM - || XEXP (XEXP (ad, 0), 1) == hard_frame_pointer_rtx -#endif -#if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM - || XEXP (XEXP (ad, 0), 1) == arg_pointer_rtx -#endif - || XEXP (XEXP (ad, 0), 1) == stack_pointer_rtx) + && GET_CODE (XEXP (XEXP (ad, 0), 1)) == REG + && REGNO (XEXP (XEXP (ad, 0), 1)) < FIRST_PSEUDO_REGISTER + && REG_MODE_OK_FOR_BASE_P (XEXP (XEXP (ad, 0), 1), mode) && ! maybe_memory_address_p (mode, ad, &XEXP (XEXP (ad, 0), 0))) { *loc = ad = gen_rtx_PLUS (GET_MODE (ad), |