Re: match.pd: Three new patterns (and some more)

2015-06-22 Thread Richard Biener
On Thu, 18 Jun 2015, Marek Polacek wrote:

 On Tue, Jun 16, 2015 at 03:35:15PM +0200, Richard Biener wrote:
  We already have
  
  /* (x  y) ^ (x | y) - x ^ y */
  (simplify
   (bit_xor:c (bit_and @0 @1) (bit_ior @0 @1))
   (bit_xor @0 @1))
  
  but of course with minus it doesn't commutate so it's hard to
  merge.
 
 Yeah :(.
  
+/* (x  y) + (x | y) - x + y */
   
   Again for symmetry, it seems like this comes with
   x + y - (x | y) - x  y
   x + y - (x  y) - x | y
   which seem fine when overflow is undefined or wraps, but not if for 
   instance
   it saturates.
  
  Can you adjust according to Marcs comment and re-submit?  If you like
  you can do it as followup as well and thus the original patch is ok
  as well.
 
 Sure.  This is a new version with some more patters.  Thanks.
 
 Bootstrapped/regtested on x86_64-linux, ok for trunk?

Ok.

Thanks,
Richard.

 2015-06-18  Marek Polacek  pola...@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.
 
   * 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.
 
 diff --git gcc/match.pd gcc/match.pd
 index 1ab2b1c..badb80a 100644
 --- gcc/match.pd
 +++ gcc/match.pd
 @@ -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))
 diff --git gcc/testsuite/gcc.dg/fold-ior-1.c gcc/testsuite/gcc.dg/fold-ior-1.c
 index e69de29..0358eb5 100644
 --- gcc/testsuite/gcc.dg/fold-ior-1.c
 +++ gcc/testsuite/gcc.dg/fold-ior-1.c
 @@ -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-notcddce1 } } */
 +/* { dg-final { scan-tree-dump-not  \\^  cddce1 } } */
 diff --git gcc/testsuite/gcc.dg/fold-minus-2.c 
 gcc/testsuite/gcc.dg/fold-minus-2.c
 index e69de29..6501f2f 100644
 --- gcc/testsuite/gcc.dg/fold-minus-2.c
 +++ gcc/testsuite/gcc.dg/fold-minus-2.c
 @@ -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 gcc/testsuite/gcc.dg/fold-minus-3.c 
 gcc/testsuite/gcc.dg/fold-minus-3.c
 index e69de29..e7adce6 100644
 --- gcc/testsuite/gcc.dg/fold-minus-3.c
 +++ gcc/testsuite/gcc.dg/fold-minus-3.c
 @@ -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)
 

Re: match.pd: Three new patterns (and some more)

2015-06-18 Thread Marek Polacek
On Tue, Jun 16, 2015 at 03:35:15PM +0200, Richard Biener wrote:
 We already have
 
 /* (x  y) ^ (x | y) - x ^ y */
 (simplify
  (bit_xor:c (bit_and @0 @1) (bit_ior @0 @1))
  (bit_xor @0 @1))
 
 but of course with minus it doesn't commutate so it's hard to
 merge.

Yeah :(.
 
   +/* (x  y) + (x | y) - x + y */
  
  Again for symmetry, it seems like this comes with
  x + y - (x | y) - x  y
  x + y - (x  y) - x | y
  which seem fine when overflow is undefined or wraps, but not if for instance
  it saturates.
 
 Can you adjust according to Marcs comment and re-submit?  If you like
 you can do it as followup as well and thus the original patch is ok
 as well.

Sure.  This is a new version with some more patters.  Thanks.

Bootstrapped/regtested on x86_64-linux, ok for trunk?

2015-06-18  Marek Polacek  pola...@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.

* 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.

diff --git gcc/match.pd gcc/match.pd
index 1ab2b1c..badb80a 100644
--- gcc/match.pd
+++ gcc/match.pd
@@ -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))
diff --git gcc/testsuite/gcc.dg/fold-ior-1.c gcc/testsuite/gcc.dg/fold-ior-1.c
index e69de29..0358eb5 100644
--- gcc/testsuite/gcc.dg/fold-ior-1.c
+++ gcc/testsuite/gcc.dg/fold-ior-1.c
@@ -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-notcddce1 } } */
+/* { dg-final { scan-tree-dump-not  \\^  cddce1 } } */
diff --git gcc/testsuite/gcc.dg/fold-minus-2.c 
gcc/testsuite/gcc.dg/fold-minus-2.c
index e69de29..6501f2f 100644
--- gcc/testsuite/gcc.dg/fold-minus-2.c
+++ gcc/testsuite/gcc.dg/fold-minus-2.c
@@ -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 gcc/testsuite/gcc.dg/fold-minus-3.c 
gcc/testsuite/gcc.dg/fold-minus-3.c
index e69de29..e7adce6 100644
--- gcc/testsuite/gcc.dg/fold-minus-3.c
+++ gcc/testsuite/gcc.dg/fold-minus-3.c
@@ -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-notcddce1 } }