diff options
author | MCC CS <deswurstes@users.noreply.github.com> | 2018-08-28 20:23:05 +0000 |
---|---|---|
committer | Jeff Law <law@gcc.gnu.org> | 2018-08-28 14:23:05 -0600 |
commit | fd8303a5087bfd4c89f92ed6225661e519464c54 (patch) | |
tree | af52c54149b05ae0fe08a4da58d96a39faac539e /gcc | |
parent | 96c19db55bcf832d1e584d3d3bcd06c3f64a36c0 (diff) | |
download | gcc-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/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/match.pd | 15 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr87009.c | 23 |
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); +} |