aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc Glisse <marc.glisse@inria.fr>2016-05-17 19:54:28 +0200
committerMarc Glisse <glisse@gcc.gnu.org>2016-05-17 17:54:28 +0000
commitd982c5b7b73b9bed5d63d614dc2ae4f17d49eb74 (patch)
tree1b1b1464fa56a7237a510a32cf422ab593a0209f
parent0139ba9332f80bad92794bcd4bfe360f2cfc42a4 (diff)
downloadgcc-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/ChangeLog4
-rw-r--r--gcc/match.pd8
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/andnot-1.c12
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" } } */