diff options
author | Alexandre Oliva <aoliva@redhat.com> | 2002-02-21 19:21:35 +0000 |
---|---|---|
committer | Alexandre Oliva <aoliva@gcc.gnu.org> | 2002-02-21 19:21:35 +0000 |
commit | 9dd791c86c770caf0b6a12a0dfae7cf0e0469f89 (patch) | |
tree | fe34e2b2c1ebf766d03406df39c4a33246595dfd /gcc | |
parent | 287dd527bdaedd75aaccec7722a2b509c7a6a06c (diff) | |
download | gcc-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')
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/rtlanal.c | 34 |
2 files changed, 39 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 14bd7a7..e1984f4 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +Thu Feb 21 16:20:46 2002 Alexandre Oliva <aoliva@redhat.com> + + * rtlanal.c (replace_rtx): Don't make a CONST_INT the operand of + SUBREG or ZERO_EXTEND. + Thu Feb 21 15:35:46 2002 J"orn Rennecke <joern.rennecke@superh.com> * sh.h (current_function_anonymous_args): Remove. 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--) { |