summaryrefslogtreecommitdiffstats
path: root/gcc/combine.c
diff options
context:
space:
mode:
authorkazu <kazu@138bc75d-0d04-0410-961f-82ee72b054a4>2003-09-14 18:31:13 +0000
committerkazu <kazu@138bc75d-0d04-0410-961f-82ee72b054a4>2003-09-14 18:31:13 +0000
commit6fd65b761257b6f6a95117a9ea45c16abbc2e306 (patch)
treea5b0797e155ac4bac07ebe1b9ec20cf022d82477 /gcc/combine.c
parent678704be065e051b58a33730268ffa6c6333d41a (diff)
downloadppe42-gcc-6fd65b761257b6f6a95117a9ea45c16abbc2e306.tar.gz
ppe42-gcc-6fd65b761257b6f6a95117a9ea45c16abbc2e306.zip
* combine.c (simplify_comparison): Convert
(ne (and (lshiftrt (xor X CST) Y) 1) 0) into (eq (and (lshiftrt X Y) 1) 0). git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@71385 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/combine.c')
-rw-r--r--gcc/combine.c33
1 files changed, 22 insertions, 11 deletions
diff --git a/gcc/combine.c b/gcc/combine.c
index 2567ca9b2d7..c18c36e8091 100644
--- a/gcc/combine.c
+++ b/gcc/combine.c
@@ -10983,19 +10983,30 @@ simplify_comparison (enum rtx_code code, rtx *pop0, rtx *pop1)
}
/* Convert (ne (and (lshiftrt (not X)) 1) 0) to
- (eq (and (lshiftrt X) 1) 0). */
+ (eq (and (lshiftrt X) 1) 0).
+ Also handle the case where (not X) is expressed using xor. */
if (const_op == 0 && equality_comparison_p
&& XEXP (op0, 1) == const1_rtx
- && GET_CODE (XEXP (op0, 0)) == LSHIFTRT
- && GET_CODE (XEXP (XEXP (op0, 0), 0)) == NOT)
- {
- op0 = simplify_and_const_int
- (op0, mode,
- gen_rtx_LSHIFTRT (mode, XEXP (XEXP (XEXP (op0, 0), 0), 0),
- XEXP (XEXP (op0, 0), 1)),
- (HOST_WIDE_INT) 1);
- code = (code == NE ? EQ : NE);
- continue;
+ && GET_CODE (XEXP (op0, 0)) == LSHIFTRT)
+ {
+ rtx shift_op = XEXP (XEXP (op0, 0), 0);
+ rtx shift_count = XEXP (XEXP (op0, 0), 1);
+
+ if (GET_CODE (shift_op) == NOT
+ || (GET_CODE (shift_op) == XOR
+ && GET_CODE (XEXP (shift_op, 1)) == CONST_INT
+ && GET_CODE (shift_count) == CONST_INT
+ && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
+ && (INTVAL (XEXP (shift_op, 1))
+ == (HOST_WIDE_INT) 1 << INTVAL (shift_count))))
+ {
+ op0 = simplify_and_const_int
+ (NULL_RTX, mode,
+ gen_rtx_LSHIFTRT (mode, XEXP (shift_op, 0), shift_count),
+ (HOST_WIDE_INT) 1);
+ code = (code == NE ? EQ : NE);
+ continue;
+ }
}
break;
OpenPOWER on IntegriCloud