This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
match.pd: x & C -> x if we know that x & ~C == 0
- From: Marc Glisse <marc dot glisse at inria dot fr>
- To: gcc-patches at gcc dot gnu dot org
- Date: Tue, 17 May 2016 08:59:24 +0200 (CEST)
- Subject: match.pd: x & C -> x if we know that x & ~C == 0
- Authentication-results: sourceware.org; auth=none
Hello,
the testcase for this patch is taken from
https://gcc.gnu.org/ml/gcc-patches/2016-05/msg00683.html
get_nonzero_bits only gives may-be-set bits. To handle an equivalent
transform for bit_ior, I would need must-be-set bits, maybe I should check
if that is available somewhere in CCP...
The patch is extremely similar to
https://gcc.gnu.org/ml/gcc-patches/2016-05/msg01042.html , I'll make sure
they are consistant with respect to testing for SSA_NAME / !POINTER_TYPE_P
if I get feedback on either (today I am leaning towards adding all
possible checks, just to be sure).
Bootstrap+regtest on powerpc64le-unknown-linux-gnu.
2016-05-17 Marc Glisse <marc.glisse@inria.fr>
gcc/
* match.pd (X & C): New transformation.
gcc/testsuite/
* gcc.dg/tree-ssa/and-1.c: New testcase.
--
Marc Glisse
Index: gcc/match.pd
===================================================================
--- gcc/match.pd (revision 236300)
+++ gcc/match.pd (working copy)
@@ -548,20 +548,28 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
(simplify
(bit_and @0 integer_all_onesp)
(non_lvalue @0))
/* x & x -> x, x | x -> x */
(for bitop (bit_and bit_ior)
(simplify
(bitop @0 @0)
(non_lvalue @0)))
+/* x & C -> x if we know that x & ~C == 0. */
+#if GIMPLE
+(simplify
+ (bit_and SSA_NAME@0 INTEGER_CST@1)
+ (if ((get_nonzero_bits (@0) & wi::bit_not (@1)) == 0)
+ @0))
+#endif
+
/* x + (x & 1) -> (x + 1) & ~1 */
(simplify
(plus:c @0 (bit_and:s @0 integer_onep@1))
(bit_and (plus @0 @1) (bit_not @1)))
/* x & ~(x & y) -> x & ~y */
/* x | ~(x | y) -> x | ~y */
(for bitop (bit_and bit_ior)
(simplify
(bitop:c @0 (bit_not (bitop:cs @0 @1)))
Index: gcc/testsuite/gcc.dg/tree-ssa/and-1.c
===================================================================
--- gcc/testsuite/gcc.dg/tree-ssa/and-1.c (revision 0)
+++ gcc/testsuite/gcc.dg/tree-ssa/and-1.c (working copy)
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fdump-tree-optimized-raw" } */
+
+int f(int in) {
+ in = in | 3;
+ in = in ^ 1;
+ in = (in & ~(unsigned long)1);
+ return in;
+}
+
+/* { dg-final { scan-tree-dump-not "bit_and_expr" "optimized" } } */