diff options
author | Hans-Peter Nilsson <hp@axis.com> | 2005-11-11 23:17:16 +0000 |
---|---|---|
committer | Hans-Peter Nilsson <hp@gcc.gnu.org> | 2005-11-11 23:17:16 +0000 |
commit | 19fe122f9469f1513bfd1a4ac1bc75fcf22781db (patch) | |
tree | 7e704d4dbdfe310631104e8df502856ebd87d948 | |
parent | b4f05423f4b8b7f3689229c27ff0d6aa3f274bc0 (diff) | |
download | gcc-19fe122f9469f1513bfd1a4ac1bc75fcf22781db.zip gcc-19fe122f9469f1513bfd1a4ac1bc75fcf22781db.tar.gz gcc-19fe122f9469f1513bfd1a4ac1bc75fcf22781db.tar.bz2 |
re PR middle-end/24750 (global-alloc (reload) trips over own confusion for unexpected addressing modes)
PR middle-end/24750
* reload.c (find_reloads_address_1) <case TRUNCATE, SIGN_EXTEND,
ZERO_EXTEND>: New cases.
From-SVN: r106804
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/reload.c | 18 |
2 files changed, 24 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6742b14..bb8033c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2005-11-12 Hans-Peter Nilsson <hp@axis.com> + + PR middle-end/24750 + * reload.c (find_reloads_address_1) <case TRUNCATE, SIGN_EXTEND, + ZERO_EXTEND>: New cases. + 2005-11-11 Daniel Jacobowitz <dan@codesourcery.com> * longlong.h (__clz_tab): Always provide. diff --git a/gcc/reload.c b/gcc/reload.c index e55bf34..0503f5a 100644 --- a/gcc/reload.c +++ b/gcc/reload.c @@ -5695,6 +5695,24 @@ find_reloads_address_1 (enum machine_mode mode, rtx x, int context, } return 0; + case TRUNCATE: + case SIGN_EXTEND: + case ZERO_EXTEND: + /* Look for parts to reload in the inner expression and reload them + too, in addition to this operation. Reloading all inner parts in + addition to this one shouldn't be necessary, but at this point, + we don't know if we can possibly omit any part that *can* be + reloaded. Targets that are better off reloading just either part + (or perhaps even a different part of an outer expression), should + define LEGITIMIZE_RELOAD_ADDRESS. */ + find_reloads_address_1 (GET_MODE (XEXP (x, 0)), XEXP (x, 0), + context, &XEXP (x, 0), opnum, + type, ind_levels, insn); + push_reload (x, NULL_RTX, loc, (rtx*) 0, + context_reg_class, + GET_MODE (x), VOIDmode, 0, 0, opnum, type); + return 1; + case MEM: /* This is probably the result of a substitution, by eliminate_regs, of an equivalent address for a pseudo that was not allocated to a hard |