diff options
author | Marc Glisse <marc.glisse@inria.fr> | 2016-05-17 19:54:28 +0200 |
---|---|---|
committer | Marc Glisse <glisse@gcc.gnu.org> | 2016-05-17 17:54:28 +0000 |
commit | d982c5b7b73b9bed5d63d614dc2ae4f17d49eb74 (patch) | |
tree | 1b1b1464fa56a7237a510a32cf422ab593a0209f | |
parent | 0139ba9332f80bad92794bcd4bfe360f2cfc42a4 (diff) | |
download | gcc-d982c5b7b73b9bed5d63d614dc2ae4f17d49eb74.zip gcc-d982c5b7b73b9bed5d63d614dc2ae4f17d49eb74.tar.gz gcc-d982c5b7b73b9bed5d63d614dc2ae4f17d49eb74.tar.bz2 |
~X & Y to X ^ Y in some cases
2016-05-17 Marc Glisse <marc.glisse@inria.fr>
gcc/
* match.pd (~X & Y): New transformation.
gcc/testsuite/
* gcc.dg/tree-ssa/pr69270.c: Adjust.
* gcc.dg/tree-ssa/andnot-1.c: New testcase.
From-SVN: r236337
-rw-r--r-- | gcc/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/match.pd | 8 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/andnot-1.c | 12 |
4 files changed, 29 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 93c1a2d..9ec5a9e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,9 @@ 2016-05-17 Marc Glisse <marc.glisse@inria.fr> + * match.pd (~X & Y): New transformation. + +2016-05-17 Marc Glisse <marc.glisse@inria.fr> + * tree-vrp.c (simplify_truth_ops_using_ranges): Set range information for new SSA_NAME. (simplify_conversion_using_ranges): Get range through get_range_info diff --git a/gcc/match.pd b/gcc/match.pd index 5b3cb3b..acc41be 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -503,6 +503,14 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) (bit_ior:c (bit_and @0 INTEGER_CST@2) (bit_and (bit_not @0) INTEGER_CST@1)) (if (wi::bit_not (@2) == @1) (bit_xor @0 @1))) +/* Simplify (~X & Y) to X ^ Y if we know that (X & ~Y) is 0. */ +#if GIMPLE +(simplify + (bit_and (bit_not SSA_NAME@0) INTEGER_CST@1) + (if (INTEGRAL_TYPE_P (TREE_TYPE (@0)) + && (get_nonzero_bits (@0) & wi::bit_not (@1)) == 0) + (bit_xor @0 @1))) +#endif /* X % Y is smaller than Y. */ (for cmp (lt ge) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ca093a1..61b6a22 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,6 +1,11 @@ 2016-05-17 Marc Glisse <marc.glisse@inria.fr> * gcc.dg/tree-ssa/pr69270.c: Adjust. + * gcc.dg/tree-ssa/andnot-1.c: New testcase. + +2016-05-17 Marc Glisse <marc.glisse@inria.fr> + + * gcc.dg/tree-ssa/pr69270.c: Adjust. * gcc.dg/tree-ssa/vrp99.c: New testcase. 2016-05-17 Jiong Wang <jiong.wang@arm.com> diff --git a/gcc/testsuite/gcc.dg/tree-ssa/andnot-1.c b/gcc/testsuite/gcc.dg/tree-ssa/andnot-1.c new file mode 100644 index 0000000..7f161b6 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/andnot-1.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "-O -fdump-tree-optimized-raw" } */ + +unsigned f(unsigned i){ + i >>= __SIZEOF_INT__ * __CHAR_BIT__ - 3; + i = ~i; + return i & 7; +} + +/* { dg-final { scan-tree-dump "bit_xor_expr" "optimized" } } */ +/* { dg-final { scan-tree-dump-not "bit_not_expr" "optimized" } } */ +/* { dg-final { scan-tree-dump-not "bit_and_expr" "optimized" } } */ |