aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>2003-04-10 15:17:36 -0700
committerRichard Henderson <rth@gcc.gnu.org>2003-04-10 15:17:36 -0700
commitb9de9ea4b19da2382a4bf738d25078e0f9b4826e (patch)
tree6a4522966c3397c6b6b77aa1cda90a098554fc9c
parent73ae1804d5a04653067bdf612a48ab5f2babaa99 (diff)
re PR rtl-optimization/10352 (ICE in find_reloads_toplev)
PR opt/10352 Tue Jul 23 21:49:24 2002 J"orn Rennecke <joern.rennecke@superh.com> * simplify-rtx.c (simplify_subreg): When converting to a non-int mode, try to convert to an integer mode of matching size first. * g++.dg/opt/reload2.C: New. From-SVN: r65441
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/simplify-rtx.c14
2 files changed, 21 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 95bc948fe15..1e7b58270aa 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2003-04-09 Richard Henderson <rth@redhat.com>
+
+ PR opt/10352
+ Tue Jul 23 21:49:24 2002 J"orn Rennecke <joern.rennecke@superh.com>
+ * simplify-rtx.c (simplify_subreg): When converting to a non-int
+ mode, try to convert to an integer mode of matching size first.
+
2003-04-09 Alan Modra <amodra@bigpond.net.au>
* config/rs6000/rs6000.c (rs6000_emit_prologue): Use correct mode to
diff --git a/gcc/simplify-rtx.c b/gcc/simplify-rtx.c
index 2896041c4fd..afd2b3c5d70 100644
--- a/gcc/simplify-rtx.c
+++ b/gcc/simplify-rtx.c
@@ -2484,6 +2484,20 @@ simplify_subreg (outermode, op, innermode, byte)
return new;
}
+ if (GET_MODE_CLASS (outermode) != MODE_INT
+ && GET_MODE_CLASS (outermode) != MODE_CC)
+ {
+ enum machine_mode new_mode = int_mode_for_mode (outermode);
+
+ if (new_mode != innermode || byte != 0)
+ {
+ op = simplify_subreg (new_mode, op, innermode, byte);
+ if (! op)
+ return NULL_RTX;
+ return simplify_subreg (outermode, op, new_mode, 0);
+ }
+ }
+
offset = byte * BITS_PER_UNIT;
switch (GET_CODE (op))
{