From 5565e8744fd07733385f1925c8b949b6be5fa60a Mon Sep 17 00:00:00 2001 From: Kazu Hirata Date: Sun, 14 Sep 2003 18:31:13 +0000 Subject: [PATCH] combine.c (simplify_comparison): Convert (ne (and (lshiftrt (xor X CST) Y) 1) 0) into (eq (and (lshiftrt X Y) 1) 0). * combine.c (simplify_comparison): Convert (ne (and (lshiftrt (xor X CST) Y) 1) 0) into (eq (and (lshiftrt X Y) 1) 0). From-SVN: r71385 --- gcc/ChangeLog | 6 ++++++ gcc/combine.c | 31 +++++++++++++++++++++---------- 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 887e10dfef9..bf770b8c9d3 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2003-09-14 Kazu Hirata + + * combine.c (simplify_comparison): Convert + (ne (and (lshiftrt (xor X CST) Y) 1) 0) into + (eq (and (lshiftrt X Y) 1) 0). + 2003-09-14 Kazu Hirata * alias.c: Follow spelling conventions. 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) + && GET_CODE (XEXP (op0, 0)) == LSHIFTRT) { - 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; + 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;