diff options
author | John Wehle <john@feith.com> | 2001-04-04 05:03:29 +0000 |
---|---|---|
committer | John Wehle <wehle@gcc.gnu.org> | 2001-04-04 05:03:29 +0000 |
commit | 7142e318454d40004a3b1b3fe86faf5f1c12fefb (patch) | |
tree | 540dcb2ec38a4d7571f50545eadd91725b7f7b97 /gcc/rtlanal.c | |
parent | 0c918ce59cdb3039f78d82bf848a311cac7cc5a3 (diff) | |
download | gcc-7142e318454d40004a3b1b3fe86faf5f1c12fefb.zip gcc-7142e318454d40004a3b1b3fe86faf5f1c12fefb.tar.gz gcc-7142e318454d40004a3b1b3fe86faf5f1c12fefb.tar.bz2 |
rtl.h (set_noop_p): Declare.
* rtl.h (set_noop_p): Declare.
* flow.c (set_noop_p): Move from here ...
* rtlanal.c (set_noop_p): ... to here and enhance.
* cse.c (delete_trivially_dead_insns): Use it.
* gcse.c (hash_scan_set): Likewise.
* jump.c (delete_noop_moves): Likewise.
* recog.c (split_all_insns): Likewise.
From-SVN: r41077
Diffstat (limited to 'gcc/rtlanal.c')
-rw-r--r-- | gcc/rtlanal.c | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/gcc/rtlanal.c b/gcc/rtlanal.c index 36c3c9f..3dd7c13 100644 --- a/gcc/rtlanal.c +++ b/gcc/rtlanal.c @@ -980,6 +980,42 @@ multiple_sets (insn) return 0; } +/* Return nonzero if the destination of SET equals the source + and there are no side effects. */ + +int +set_noop_p (set) + rtx set; +{ + rtx src = SET_SRC (set); + rtx dst = SET_DEST (set); + + if (side_effects_p (src) || side_effects_p (dst)) + return 0; + + if (GET_CODE (dst) == MEM && GET_CODE (src) == MEM) + return rtx_equal_p (dst, src); + + if (GET_CODE (dst) == SIGN_EXTRACT + || GET_CODE (dst) == ZERO_EXTRACT) + return rtx_equal_p (XEXP (dst, 0), src) + && ! BYTES_BIG_ENDIAN && XEXP (dst, 2) == const0_rtx; + + if (GET_CODE (dst) == STRICT_LOW_PART) + dst = XEXP (dst, 0); + + if (GET_CODE (src) == SUBREG && GET_CODE (dst) == SUBREG) + { + if (SUBREG_BYTE (src) != SUBREG_BYTE (dst)) + return 0; + src = SUBREG_REG (src); + dst = SUBREG_REG (dst); + } + + return (GET_CODE (src) == REG && GET_CODE (dst) == REG + && REGNO (src) == REGNO (dst)); +} + /* Return the last thing that X was assigned from before *PINSN. If VALID_TO is not NULL_RTX then verify that the object is not modified up to VALID_TO. If the object was modified, if we hit a partial assignment to X, or hit a |