aboutsummaryrefslogtreecommitdiff
path: root/gcc/rtlanal.c
diff options
context:
space:
mode:
authorAlexandre Oliva <aoliva@redhat.com>2002-02-21 19:21:35 +0000
committerAlexandre Oliva <aoliva@gcc.gnu.org>2002-02-21 19:21:35 +0000
commit9dd791c86c770caf0b6a12a0dfae7cf0e0469f89 (patch)
treefe34e2b2c1ebf766d03406df39c4a33246595dfd /gcc/rtlanal.c
parent287dd527bdaedd75aaccec7722a2b509c7a6a06c (diff)
downloadgcc-9dd791c86c770caf0b6a12a0dfae7cf0e0469f89.zip
gcc-9dd791c86c770caf0b6a12a0dfae7cf0e0469f89.tar.gz
gcc-9dd791c86c770caf0b6a12a0dfae7cf0e0469f89.tar.bz2
rtlanal.c (replace_rtx): Don't make a CONST_INT the operand of SUBREG or ZERO_EXTEND.
* rtlanal.c (replace_rtx): Don't make a CONST_INT the operand of SUBREG or ZERO_EXTEND. From-SVN: r49935
Diffstat (limited to 'gcc/rtlanal.c')
-rw-r--r--gcc/rtlanal.c34
1 files changed, 34 insertions, 0 deletions
diff --git a/gcc/rtlanal.c b/gcc/rtlanal.c
index 37f1e64..5f338e8 100644
--- a/gcc/rtlanal.c
+++ b/gcc/rtlanal.c
@@ -2417,6 +2417,40 @@ replace_rtx (x, from, to)
if (x == 0)
return 0;
+ if (GET_CODE (x) == SUBREG)
+ {
+ rtx new = replace_rtx (SUBREG_REG (x), from, to);
+
+ if (GET_CODE (new) == CONST_INT)
+ {
+ x = simplify_subreg (GET_MODE (x), new,
+ GET_MODE (SUBREG_REG (x)),
+ SUBREG_BYTE (x));
+ if (! x)
+ abort ();
+ }
+ else
+ SUBREG_REG (x) = new;
+
+ return x;
+ }
+ else if (GET_CODE (x) == ZERO_EXTEND)
+ {
+ rtx new = replace_rtx (XEXP (x, 0), from, to);
+
+ if (GET_CODE (new) == CONST_INT)
+ {
+ x = simplify_unary_operation (ZERO_EXTEND, GET_MODE (x),
+ new, GET_MODE (XEXP (x, 0)));
+ if (! x)
+ abort ();
+ }
+ else
+ XEXP (x, 0) = new;
+
+ return x;
+ }
+
fmt = GET_RTX_FORMAT (GET_CODE (x));
for (i = GET_RTX_LENGTH (GET_CODE (x)) - 1; i >= 0; i--)
{