From b9de9ea4b19da2382a4bf738d25078e0f9b4826e Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Thu, 10 Apr 2003 15:17:36 -0700 Subject: [PATCH] re PR rtl-optimization/10352 (ICE in find_reloads_toplev) PR opt/10352 Tue Jul 23 21:49:24 2002 J"orn Rennecke * 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 --- gcc/ChangeLog | 7 +++++++ gcc/simplify-rtx.c | 14 ++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 95bc948fe15c..1e7b58270aa2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2003-04-09 Richard Henderson + + PR opt/10352 + Tue Jul 23 21:49:24 2002 J"orn Rennecke + * 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 * config/rs6000/rs6000.c (rs6000_emit_prologue): Use correct mode to diff --git a/gcc/simplify-rtx.c b/gcc/simplify-rtx.c index 2896041c4fd9..afd2b3c5d704 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)) { -- 2.47.2