match.pd ((x ^ y) ^ (x | y) -> x & y, (x & y) + (x ^ y) -> x | y, (x & y) | (x ^...
authorMarek Polacek <polacek@redhat.com>
Mon, 22 Jun 2015 14:46:14 +0000 (14:46 +0000)
committerMarek Polacek <mpolacek@gcc.gnu.org>
Mon, 22 Jun 2015 14:46:14 +0000 (14:46 +0000)
* match.pd ((x ^ y) ^ (x | y) -> x & y,
(x & y) + (x ^ y) -> x | y, (x & y) | (x ^ y) -> x | y,
(x & y) ^ (x ^ y) -> x | y, (x & y) + (x | y) -> x + y,
(x | y) - (x ^ y) -> x & y, (x | y) - (x & y) -> x ^ y): New patterns.

* gcc.dg/fold-ior-1.c: New test.
* gcc.dg/fold-minus-2.c: New test.
* gcc.dg/fold-minus-3.c: New test.
* gcc.dg/fold-plus-1.c: New test.
* gcc.dg/fold-plus-2.c: New test.
* gcc.dg/fold-xor-4.c: New test.
* gcc.dg/fold-xor-5.c: New test.

From-SVN: r224734

gcc/ChangeLog
gcc/match.pd
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/fold-ior-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/fold-minus-2.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/fold-minus-3.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/fold-plus-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/fold-plus-2.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/fold-xor-4.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/fold-xor-5.c [new file with mode: 0644]

index 6ca98cf10f710a72532b301403d8708a853a0865..0b3ea81c7d3c88e79d4940a5a80b0ebf05c4ad42 100644 (file)
@@ -1,3 +1,10 @@
+2015-06-22  Marek Polacek  <polacek@redhat.com>
+
+       * match.pd ((x ^ y) ^ (x | y) -> x & y,
+       (x & y) + (x ^ y) -> x | y, (x & y) | (x ^ y) -> x | y,
+       (x & y) ^ (x ^ y) -> x | y, (x & y) + (x | y) -> x + y,
+       (x | y) - (x ^ y) -> x & y, (x | y) - (x & y) -> x ^ y): New patterns.
+
 2015-06-22  Uros Bizjak  <ubizjak@gmail.com>
 
        PR target/65871
index 1ab2b1c0056829a33bf7a7b8279e8efde8354fb3..badb80a28a7e1ff77fb0a1d6bc3a4e9ee6747184 100644 (file)
@@ -325,6 +325,34 @@ along with GCC; see the file COPYING3.  If not see
  (bit_xor:c (bit_and @0 @1) (bit_ior @0 @1))
  (bit_xor @0 @1))
 
+/* (x ^ y) ^ (x | y) -> x & y */
+(simplify
+ (bit_xor:c (bit_xor @0 @1) (bit_ior @0 @1))
+ (bit_and @0 @1))
+
+/* (x & y) + (x ^ y) -> x | y */
+/* (x & y) | (x ^ y) -> x | y */
+/* (x & y) ^ (x ^ y) -> x | y */
+(for op (plus bit_ior bit_xor)
+ (simplify
+  (op:c (bit_and @0 @1) (bit_xor @0 @1))
+  (bit_ior @0 @1)))
+
+/* (x & y) + (x | y) -> x + y */
+(simplify
+ (plus:c (bit_and @0 @1) (bit_ior @0 @1))
+ (plus @0 @1))
+
+/* (x | y) - (x ^ y) -> x & y */
+(simplify
+ (minus (bit_ior @0 @1) (bit_xor @0 @1))
+ (bit_and @0 @1))
+
+/* (x | y) - (x & y) -> x ^ y */
+(simplify
+ (minus (bit_ior @0 @1) (bit_and @0 @1))
+ (bit_xor @0 @1))
+
 (simplify
  (abs (negate @0))
  (abs @0))
index faa73a5dccf19431b96838fa2ee0eb1f468ffe76..f9d26537b4b6b1958d90a73ecc8da5fec53dfc11 100644 (file)
@@ -1,3 +1,13 @@
+2015-06-22  Marek Polacek  <polacek@redhat.com>
+
+       * gcc.dg/fold-ior-1.c: New test.
+       * gcc.dg/fold-minus-2.c: New test.
+       * gcc.dg/fold-minus-3.c: New test.
+       * gcc.dg/fold-plus-1.c: New test.
+       * gcc.dg/fold-plus-2.c: New test.
+       * gcc.dg/fold-xor-4.c: New test.
+       * gcc.dg/fold-xor-5.c: New test.
+
 2015-06-22  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
 
        PR target/65914
diff --git a/gcc/testsuite/gcc.dg/fold-ior-1.c b/gcc/testsuite/gcc.dg/fold-ior-1.c
new file mode 100644 (file)
index 0000000..0358eb5
--- /dev/null
@@ -0,0 +1,69 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fdump-tree-cddce1" } */
+
+int
+fn1 (int a, int b)
+{
+  int tem1 = a & b;
+  int tem2 = a ^ b;
+  return tem1 | tem2;
+}
+
+int
+fn2 (int a, int b)
+{
+  int tem1 = b & a;
+  int tem2 = a ^ b;
+  return tem1 | tem2;
+}
+
+int
+fn3 (int a, int b)
+{
+  int tem1 = a & b;
+  int tem2 = b ^ a;
+  return tem1 | tem2;
+}
+
+int
+fn4 (int a, int b)
+{
+  int tem1 = b & a;
+  int tem2 = b ^ a;
+  return tem1 | tem2;
+}
+
+int
+fn5 (int a, int b)
+{
+  int tem1 = a ^ b;
+  int tem2 = a & b;
+  return tem1 | tem2;
+}
+
+int
+fn6 (int a, int b)
+{
+  int tem1 = b ^ a;
+  int tem2 = a & b;
+  return tem1 | tem2;
+}
+
+int
+fn7 (int a, int b)
+{
+  int tem1 = a ^ b;
+  int tem2 = b & a;
+  return tem1 | tem2;
+}
+
+int
+fn8 (int a, int b)
+{
+  int tem1 = b ^ a;
+  int tem2 = b & a;
+  return tem1 | tem2;
+}
+
+/* { dg-final { scan-tree-dump-not " & " "cddce1" } } */
+/* { dg-final { scan-tree-dump-not " \\^ " "cddce1" } } */
diff --git a/gcc/testsuite/gcc.dg/fold-minus-2.c b/gcc/testsuite/gcc.dg/fold-minus-2.c
new file mode 100644 (file)
index 0000000..6501f2f
--- /dev/null
@@ -0,0 +1,37 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fdump-tree-cddce1" } */
+
+int
+fn1 (int a, int b)
+{
+  int tem1 = a | b;
+  int tem2 = a ^ b;
+  return tem1 - tem2;
+}
+
+int
+fn2 (int a, int b)
+{
+  int tem1 = b | a;
+  int tem2 = a ^ b;
+  return tem1 - tem2;
+}
+
+int
+fn3 (int a, int b)
+{
+  int tem1 = a | b;
+  int tem2 = b ^ a;
+  return tem1 - tem2;
+}
+
+int
+fn4 (int a, int b)
+{
+  int tem1 = b | a;
+  int tem2 = b ^ a;
+  return tem1 - tem2;
+}
+
+/* { dg-final { scan-tree-dump-not " \\^ " "cddce1" } } */
+/* { dg-final { scan-tree-dump-not " \\| " "cddce1" } } */
diff --git a/gcc/testsuite/gcc.dg/fold-minus-3.c b/gcc/testsuite/gcc.dg/fold-minus-3.c
new file mode 100644 (file)
index 0000000..e7adce6
--- /dev/null
@@ -0,0 +1,37 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fdump-tree-cddce1" } */
+
+int
+fn1 (int a, int b)
+{
+  int tem1 = a | b;
+  int tem2 = a & b;
+  return tem1 - tem2;
+}
+
+int
+fn2 (int a, int b)
+{
+  int tem1 = b | a;
+  int tem2 = a & b;
+  return tem1 - tem2;
+}
+
+int
+fn3 (int a, int b)
+{
+  int tem1 = a | b;
+  int tem2 = b & a;
+  return tem1 - tem2;
+}
+
+int
+fn4 (int a, int b)
+{
+  int tem1 = b | a;
+  int tem2 = b & a;
+  return tem1 - tem2;
+}
+
+/* { dg-final { scan-tree-dump-not " \\| " "cddce1" } } */
+/* { dg-final { scan-tree-dump-not " & " "cddce1" } } */
diff --git a/gcc/testsuite/gcc.dg/fold-plus-1.c b/gcc/testsuite/gcc.dg/fold-plus-1.c
new file mode 100644 (file)
index 0000000..40d6aa2
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fdump-tree-cddce1" } */
+
+int
+fn1 (int a, int b)
+{
+  int tem1 = a & b;
+  int tem2 = a ^ b;
+  return tem1 + tem2;
+}
+
+int
+fn2 (int a, int b)
+{
+  int tem1 = b & a;
+  int tem2 = a ^ b;
+  return tem1 + tem2;
+}
+
+int
+fn3 (int a, int b)
+{
+  int tem1 = a & b;
+  int tem2 = b ^ a;
+  return tem1 + tem2;
+}
+
+int
+fn4 (int a, int b)
+{
+  int tem1 = b & a;
+  int tem2 = b ^ a;
+  return tem1 + tem2;
+}
+
+int
+fn5 (int a, int b)
+{
+  int tem1 = a ^ b;
+  int tem2 = a & b;
+  return tem1 + tem2;
+}
+
+int
+fn6 (int a, int b)
+{
+  int tem1 = b ^ a;
+  int tem2 = a & b;
+  return tem1 + tem2;
+}
+
+int
+fn7 (int a, int b)
+{
+  int tem1 = a ^ b;
+  int tem2 = b & a;
+  return tem1 + tem2;
+}
+
+int
+fn8 (int a, int b)
+{
+  int tem1 = b ^ a;
+  int tem2 = b & a;
+  return tem1 + tem2;
+}
+
+/* { dg-final { scan-tree-dump-not " & " "cddce1" } } */
+/* { dg-final { scan-tree-dump-not " \\^ " "cddce1" } } */
+/* { dg-final { scan-tree-dump-not " \\+ " "cddce1" } } */
diff --git a/gcc/testsuite/gcc.dg/fold-plus-2.c b/gcc/testsuite/gcc.dg/fold-plus-2.c
new file mode 100644 (file)
index 0000000..713abf6
--- /dev/null
@@ -0,0 +1,69 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fdump-tree-cddce1" } */
+
+int
+fn1 (int a, int b)
+{
+  int tem1 = a & b;
+  int tem2 = a | b;
+  return tem1 + tem2;
+}
+
+int
+fn2 (int a, int b)
+{
+  int tem1 = b & a;
+  int tem2 = a | b;
+  return tem1 + tem2;
+}
+
+int
+fn3 (int a, int b)
+{
+  int tem1 = a & b;
+  int tem2 = b | a;
+  return tem1 + tem2;
+}
+
+int
+fn4 (int a, int b)
+{
+  int tem1 = b & a;
+  int tem2 = b | a;
+  return tem1 + tem2;
+}
+
+int
+fn5 (int a, int b)
+{
+  int tem1 = a | b;
+  int tem2 = a & b;
+  return tem1 + tem2;
+}
+
+int
+fn6 (int a, int b)
+{
+  int tem1 = b | a;
+  int tem2 = a & b;
+  return tem1 + tem2;
+}
+
+int
+fn7 (int a, int b)
+{
+  int tem1 = a | b;
+  int tem2 = b & a;
+  return tem1 + tem2;
+}
+
+int
+fn8 (int a, int b)
+{
+  int tem1 = b | a;
+  int tem2 = b & a;
+  return tem1 + tem2;
+}
+
+/* { dg-final { scan-tree-dump-not " & " "cddce1" } } */
+/* { dg-final { scan-tree-dump-not " \\| " "cddce1" } } */
diff --git a/gcc/testsuite/gcc.dg/fold-xor-4.c b/gcc/testsuite/gcc.dg/fold-xor-4.c
new file mode 100644 (file)
index 0000000..b5a2c48
--- /dev/null
@@ -0,0 +1,69 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fdump-tree-cddce1" } */
+
+int
+fn1 (int a, int b)
+{
+  int tem1 = a & b;
+  int tem2 = a ^ b;
+  return tem1 ^ tem2;
+}
+
+int
+fn2 (int a, int b)
+{
+  int tem1 = b & a;
+  int tem2 = a ^ b;
+  return tem1 ^ tem2;
+}
+
+int
+fn3 (int a, int b)
+{
+  int tem1 = a & b;
+  int tem2 = b ^ a;
+  return tem1 ^ tem2;
+}
+
+int
+fn4 (int a, int b)
+{
+  int tem1 = b & a;
+  int tem2 = b ^ a;
+  return tem1 ^ tem2;
+}
+
+int
+fn5 (int a, int b)
+{
+  int tem1 = a ^ b;
+  int tem2 = a & b;
+  return tem1 ^ tem2;
+}
+
+int
+fn6 (int a, int b)
+{
+  int tem1 = b ^ a;
+  int tem2 = a & b;
+  return tem1 ^ tem2;
+}
+
+int
+fn7 (int a, int b)
+{
+  int tem1 = a ^ b;
+  int tem2 = b & a;
+  return tem1 ^ tem2;
+}
+
+int
+fn8 (int a, int b)
+{
+  int tem1 = b ^ a;
+  int tem2 = b & a;
+  return tem1 ^ tem2;
+}
+
+/* { dg-final { scan-tree-dump-not " & " "cddce1" } } */
+/* { dg-final { scan-tree-dump-not " \\^ " "cddce1" } } */
diff --git a/gcc/testsuite/gcc.dg/fold-xor-5.c b/gcc/testsuite/gcc.dg/fold-xor-5.c
new file mode 100644 (file)
index 0000000..15ee76c
--- /dev/null
@@ -0,0 +1,69 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fdump-tree-cddce1" } */
+
+int
+fn1 (int a, int b)
+{
+  int tem1 = a | b;
+  int tem2 = a ^ b;
+  return tem1 ^ tem2;
+}
+
+int
+fn2 (int a, int b)
+{
+  int tem1 = b | a;
+  int tem2 = a ^ b;
+  return tem1 ^ tem2;
+}
+
+int
+fn3 (int a, int b)
+{
+  int tem1 = a | b;
+  int tem2 = b ^ a;
+  return tem1 ^ tem2;
+}
+
+int
+fn4 (int a, int b)
+{
+  int tem1 = b | a;
+  int tem2 = b ^ a;
+  return tem1 ^ tem2;
+}
+
+int
+fn5 (int a, int b)
+{
+  int tem1 = a ^ b;
+  int tem2 = a | b;
+  return tem1 ^ tem2;
+}
+
+int
+fn6 (int a, int b)
+{
+  int tem1 = b ^ a;
+  int tem2 = a | b;
+  return tem1 ^ tem2;
+}
+
+int
+fn7 (int a, int b)
+{
+  int tem1 = a ^ b;
+  int tem2 = b | a;
+  return tem1 ^ tem2;
+}
+
+int
+fn8 (int a, int b)
+{
+  int tem1 = b ^ a;
+  int tem2 = b | a;
+  return tem1 ^ tem2;
+}
+
+/* { dg-final { scan-tree-dump-not " \\| " "cddce1" } } */
+/* { dg-final { scan-tree-dump-not " \\^ " "cddce1" } } */