match.pd ((x | y) & ~x -> y & ~x, (x & y) | ~x -> y | ~x): New simplifications.
authorMarc Glisse <marc.glisse@inria.fr>
Fri, 22 May 2015 20:37:04 +0000 (22:37 +0200)
committerMarc Glisse <glisse@gcc.gnu.org>
Fri, 22 May 2015 20:37:04 +0000 (20:37 +0000)
2015-05-22  Marc Glisse  <marc.glisse@inria.fr>

gcc/
* match.pd ((x | y) & ~x -> y & ~x, (x & y) | ~x -> y | ~x): New
simplifications.
gcc/testsuite/
* gcc.dg/nand.c: New testcase.

From-SVN: r223587

gcc/ChangeLog
gcc/match.pd
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/nand.c [new file with mode: 0644]

index 769c7b5e58f08157b0fbf1703b2d5971abe1b0ed..ceb9444765fb4772d65e7d5cfbea97946b9645c8 100644 (file)
@@ -1,3 +1,8 @@
+2015-05-22  Marc Glisse  <marc.glisse@inria.fr>
+
+       * match.pd ((x | y) & ~x -> y & ~x, (x & y) | ~x -> y | ~x): New
+       simplifications.
+
 2015-05-22  Jeff Law  <law@redhat.com>
 
        * config/pa/pa.md (integer_indexed_store splitters): Use
index 73ccfbd4b00e7e5054bd9c1ce327c702338f4803..33419ebdcb651676adc35ecdac23f62731d4a280 100644 (file)
@@ -280,10 +280,18 @@ along with GCC; see the file COPYING3.  If not see
 /* x & ~(x & y) -> x & ~y */
 /* x | ~(x | y) -> x | ~y  */
 (for bitop (bit_and bit_ior)
-  (simplify
-    (bitop:c @0 (bit_not (bitop:c@2 @0 @1)))
-      (if (TREE_CODE (@2) != SSA_NAME || has_single_use (@2))
-       (bitop @0 (bit_not @1)))))
+ (simplify
+  (bitop:c @0 (bit_not (bitop:c@2 @0 @1)))
+   (if (TREE_CODE (@2) != SSA_NAME || has_single_use (@2))
+    (bitop @0 (bit_not @1)))))
+
+/* (x | y) & ~x -> y & ~x */
+/* (x & y) | ~x -> y | ~x */
+(for bitop (bit_and bit_ior)
+     rbitop (bit_ior bit_and)
+ (simplify
+  (bitop:c (rbitop:c @0 @1) (bit_not@2 @0))
+  (bitop @1 @2)))
 
 (simplify
  (abs (negate @0))
index 0b0de20c7dffee1f4ef61103cf539f4c66e7f4f9..8d480a3a21f11647e79261a5111fda851e3af11b 100644 (file)
@@ -1,3 +1,7 @@
+2015-05-22  Marc Glisse  <marc.glisse@inria.fr>
+
+       * gcc.dg/nand.c: New testcase.
+
 2015-05-22  Sandra Loosemore  <sandra@codesourcery.com>
 
        * gcc.target/aarch64/advsimd-intrinsics/advsimd-intrinsics.exp:
diff --git a/gcc/testsuite/gcc.dg/nand.c b/gcc/testsuite/gcc.dg/nand.c
new file mode 100644 (file)
index 0000000..28df581
--- /dev/null
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fdump-tree-original" } */
+
+unsigned f(unsigned x, unsigned y){
+  return (x | y) & ~x;
+}
+unsigned g(unsigned x, unsigned y){
+  return ~x & (y | x);
+}
+
+/* { dg-final { scan-tree-dump-times "return ~x & y;" 2 "original" } } */
+/* { dg-final { cleanup-tree-dump "original" } } */