Hi all,

One week ago I proposed a patch that catches
~(~x | y), (~x | y) & (x | ~y) and
(~x | y) ^ (x | ~y)
Although it was straightforward, it got
only one review. Could you please review it?
If you find it OK, I don't have push access.
Is it possible for you to push it?

Best regards.

History:
patch: https://gcc.gnu.org/ml/gcc-patches/2018-08/msg01159.html
review 1: https://gcc.gnu.org/ml/gcc-patches/2018-08/msg01169.html
updated patch: https://gcc.gnu.org/ml/gcc-patches/2018-08/msg01299.html

Below is an exact copy of the updated patch:

2018-08-21 MCC CS <deswurs...@users.noreply.github.com>

gcc/
PR tree-optimization/87009
* match.pd: Add boolean optimizations.

2018-08-21 MCC CS <deswurs...@users.noreply.github.com>

gcc/testsuite/
PR tree-optimization/87009
* gcc.dg/pr87009.c: New test.

Index: gcc/match.pd
===================================================================
--- gcc/match.pd (revision 263646)
+++ gcc/match.pd (working copy)
@@ -776,6 +776,11 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
(bit_not (bit_and:cs (bit_not @0) @1))
(bit_ior @0 (bit_not @1)))

+/* ~(~a | b) --> a & ~b */
+(simplify
+ (bit_not (bit_ior:cs (bit_not @0) @1))
+ (bit_and @0 (bit_not @1)))
+
/* Simplify (~X & Y) to X ^ Y if we know that (X & ~Y) is 0. */
#if GIMPLE
(simplify
@@ -981,6 +986,16 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
(bit_and:c (bit_ior:c @0 @1) (bit_xor:c @1 (bit_not @0)))
(bit_and @0 @1))

+/* (~x | y) & (x | ~y) -> ~(x ^ y) */
+(simplify
+ (bit_and (bit_ior:c (bit_not @0) @1) (bit_ior:c @0 (bit_not @1)))
+ (bit_not (bit_xor @0 @1)))
+
+/* (~x | y) ^ (x | ~y) -> x ^ y */
+(simplify
+ (bit_xor (bit_ior:c (bit_not @0) @1) (bit_ior:c @0 (bit_not @1)))
+ (bit_xor @0 @1))
+
/* ~x & ~y -> ~(x | y)
~x | ~y -> ~(x & y) */
(for op (bit_and bit_ior)
Index: gcc/testsuite/gcc.dg/pr87009.c
===================================================================
--- gcc/testsuite/gcc.dg/pr87009.c (nonexistent)
+++ gcc/testsuite/gcc.dg/pr87009.c (working copy)
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fdump-tree-original" } */
+/* { dg-final { scan-tree-dump-times "return s \\^ x;" 4 "original" } } */
+
+int f1 (int x, int s)
+{
+ return ~(~(x|s)|x)|~(~(x|s)|s);
+}
+
+int f2 (int x, int s)
+{
+ return ~(~(~x&s)&~(x&~s));
+}
+
+int f3 (int x, int s)
+{
+ return ~((x|~s)&(~x|s));
+}
+
+int f4 (int x, int s)
+{
+ return (x|~s)^(~x|s);
+}

Reply via email to