diff options
author | Andy Hutchinson <hutchinsonandy@aim.com> | 2008-09-14 12:50:10 +0000 |
---|---|---|
committer | Anatoly Sokolov <aesok@gcc.gnu.org> | 2008-09-14 16:50:10 +0400 |
commit | 9215065fd6861ffbe6e5d7348dca6720f594612b (patch) | |
tree | b1ce23fee97293e0ddc968da9d75c9fcfe96e8f3 /gcc/config/avr | |
parent | f67894ed5f8520f7c6367122dda3a5f9feabd0e5 (diff) | |
download | gcc-9215065fd6861ffbe6e5d7348dca6720f594612b.zip gcc-9215065fd6861ffbe6e5d7348dca6720f594612b.tar.gz gcc-9215065fd6861ffbe6e5d7348dca6720f594612b.tar.bz2 |
re PR target/19636 (Can't compile large switch statement)
PR target/19636
PR target/24894
PR target/31644
PR target/31786
* config/avr/avr.c (legitimate_address_p): Fix problem where subreg
is not recognized as a valid register usage. Allow REG_X to be used
as a base pointer.
* config/avr/avr.h (LEGITIMIZE_RELOAD_ADDRESS): Remove code that
forces a reload when using a base register.
From-SVN: r140360
Diffstat (limited to 'gcc/config/avr')
-rw-r--r-- | gcc/config/avr/avr.c | 3 | ||||
-rw-r--r-- | gcc/config/avr/avr.h | 4 |
2 files changed, 3 insertions, 4 deletions
diff --git a/gcc/config/avr/avr.c b/gcc/config/avr/avr.c index fb217bb..279aea5 100644 --- a/gcc/config/avr/avr.c +++ b/gcc/config/avr/avr.c @@ -1089,6 +1089,8 @@ legitimate_address_p (enum machine_mode mode, rtx x, int strict) true_regnum (XEXP (x, 0))); debug_rtx (x); } + if (!strict && GET_CODE (x) == SUBREG) + x = SUBREG_REG (x); if (REG_P (x) && (strict ? REG_OK_FOR_BASE_STRICT_P (x) : REG_OK_FOR_BASE_NOSTRICT_P (x))) r = POINTER_REGS; @@ -1103,6 +1105,7 @@ legitimate_address_p (enum machine_mode mode, rtx x, int strict) if (fit) { if (! strict + || REGNO (XEXP (x,0)) == REG_X || REGNO (XEXP (x,0)) == REG_Y || REGNO (XEXP (x,0)) == REG_Z) r = BASE_POINTER_REGS; diff --git a/gcc/config/avr/avr.h b/gcc/config/avr/avr.h index 7440985..3b7cbbb 100644 --- a/gcc/config/avr/avr.h +++ b/gcc/config/avr/avr.h @@ -483,10 +483,6 @@ do { \ OPNUM, TYPE); \ goto WIN; \ } \ - push_reload (XEXP (X, 0), NULL_RTX, &XEXP (X, 0), NULL, \ - BASE_POINTER_REGS, GET_MODE (X), VOIDmode, 0, 0, \ - OPNUM, TYPE); \ - goto WIN; \ } \ else if (! (frame_pointer_needed && XEXP (X,0) == frame_pointer_rtx)) \ { \ |