aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMCC CS <deswurstes@users.noreply.github.com>2018-08-28 20:23:05 +0000
committerJeff Law <law@gcc.gnu.org>2018-08-28 14:23:05 -0600
commitfd8303a5087bfd4c89f92ed6225661e519464c54 (patch)
treeaf52c54149b05ae0fe08a4da58d96a39faac539e /gcc
parent96c19db55bcf832d1e584d3d3bcd06c3f64a36c0 (diff)
downloadgcc-fd8303a5087bfd4c89f92ed6225661e519464c54.zip
gcc-fd8303a5087bfd4c89f92ed6225661e519464c54.tar.gz
gcc-fd8303a5087bfd4c89f92ed6225661e519464c54.tar.bz2
re PR middle-end/87009 (Can't find XOR pattern applying De Morgan sequentially)
PR tree-optimization/87009 * match.pd: Add boolean optimizations. PR tree-optimization/87009 * gcc.dg/pr87009.c: New test. From-SVN: r263931
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/match.pd15
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/pr87009.c23
4 files changed, 48 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b4b56da..3dbee46 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2018-08-28 MCC CS <deswurstes@users.noreply.github.com>
+
+ PR tree-optimization/87009
+ * match.pd: Add boolean optimizations.
+
2018-08-28 Martin Sebor <msebor@redhat.com>
PR middle-end/86631
diff --git a/gcc/match.pd b/gcc/match.pd
index d43e52d..be669ca 100644
--- a/gcc/match.pd
+++ b/gcc/match.pd
@@ -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:cs (bit_not @0) @1) (bit_ior:cs @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)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 3a1b8d5..72f5a95 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2018-08-28 MCC CS <deswurstes@users.noreply.github.com>
+
+ PR tree-optimization/87009
+ * gcc.dg/pr87009.c: New test.
+
2018-08-28 Martin Sebor <msebor@redhat.com>
PR middle-end/86631
diff --git a/gcc/testsuite/gcc.dg/pr87009.c b/gcc/testsuite/gcc.dg/pr87009.c
new file mode 100644
index 0000000..eb8a4ec
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr87009.c
@@ -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);
+}