From: Richard Henderson Date: Thu, 10 Apr 2003 22:17:36 +0000 (-0700) Subject: re PR rtl-optimization/10352 (ICE in find_reloads_toplev) X-Git-Tag: releases/gcc-3.2.3~26 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b9de9ea4b19da2382a4bf738d25078e0f9b4826e;p=thirdparty%2Fgcc.git 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 --- 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)) {