From 1abd4811383e7aeb22607304bae87595bebde935 Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Wed, 26 Mar 2003 08:58:49 +0100 Subject: [PATCH] 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: r64891 --- gcc/ChangeLog | 7 +++++++ gcc/reload.c | 35 ++++++++++++++--------------------- gcc/testsuite/ChangeLog | 4 ++++ 3 files changed, 25 insertions(+), 21 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ebdd20c98d54..8532a73e15fd 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2003-03-26 Eric Botcazou + + PR target/7784 + * reload.c (find_reloads_address): Handle + (PLUS (PLUS (REG) (REG)) (CONST_INT)) form for + all base registers. + 2003-03-25 Jason Merrill PR optimization/10171 diff --git a/gcc/reload.c b/gcc/reload.c index 71ed1d6771c3..a27da2498275 100644 --- a/gcc/reload.c +++ b/gcc/reload.c @@ -4825,25 +4825,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) && ! memory_address_p (mode, ad)) { *loc = ad = gen_rtx_PLUS (GET_MODE (ad), @@ -4861,14 +4859,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) && ! memory_address_p (mode, ad)) { *loc = ad = gen_rtx_PLUS (GET_MODE (ad), diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 98cb57bd00e2..b014b09420bd 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2003-03-26 Eric Botcazou + + * gcc.dg/ultrasp6.c: New test. + 2003-03-25 Eric Botcazou * gcc.dg/i386-signbit-1.c: Tweak options. -- 2.47.2