aboutsummaryrefslogtreecommitdiff
path: root/gcc/rtlanal.c
diff options
context:
space:
mode:
authorJohn Wehle <john@feith.com>2001-04-04 05:03:29 +0000
committerJohn Wehle <wehle@gcc.gnu.org>2001-04-04 05:03:29 +0000
commit7142e318454d40004a3b1b3fe86faf5f1c12fefb (patch)
tree540dcb2ec38a4d7571f50545eadd91725b7f7b97 /gcc/rtlanal.c
parent0c918ce59cdb3039f78d82bf848a311cac7cc5a3 (diff)
downloadgcc-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.c36
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