aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans-Peter Nilsson <hp@axis.com>2005-11-11 23:17:16 +0000
committerHans-Peter Nilsson <hp@gcc.gnu.org>2005-11-11 23:17:16 +0000
commit19fe122f9469f1513bfd1a4ac1bc75fcf22781db (patch)
tree7e704d4dbdfe310631104e8df502856ebd87d948
parentb4f05423f4b8b7f3689229c27ff0d6aa3f274bc0 (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/reload.c18
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