diff options
author | Marc Glisse <marc.glisse@inria.fr> | 2017-06-28 11:22:30 +0200 |
---|---|---|
committer | Marc Glisse <glisse@gcc.gnu.org> | 2017-06-28 09:22:30 +0000 |
commit | 42bd89ce072220f3569cb5e761235dcf1c675c68 (patch) | |
tree | 5fb4ca44d3407af3a15cbc4392d4ebc6933067b7 | |
parent | 883312dc79806f513275b72502231c751c14ff72 (diff) | |
download | gcc-42bd89ce072220f3569cb5e761235dcf1c675c68.zip gcc-42bd89ce072220f3569cb5e761235dcf1c675c68.tar.gz gcc-42bd89ce072220f3569cb5e761235dcf1c675c68.tar.bz2 |
Simplify 3*x == 3*y for wrapping types
2017-06-28 Marc Glisse <marc.glisse@inria.fr>
gcc/
* match.pd ((X & ~Y) | (~X & Y)): Generalize to + and ^.
(x * C EQ/NE y * C): New transformation.
gcc/testsuite/
* gcc.dg/tree-ssa/addadd.c: Remove test duplicated in addadd-2.c.
* gcc.dg/tree-ssa/mulcmp-1.c: New file.
From-SVN: r249732
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/match.pd | 27 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/addadd.c | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/mulcmp-1.c | 10 |
5 files changed, 39 insertions, 13 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d7b45ef..51ce1bf 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2017-06-28 Marc Glisse <marc.glisse@inria.fr> + + * match.pd ((X & ~Y) | (~X & Y)): Generalize to + and ^. + (x * C EQ/NE y * C): New transformation. + 2017-06-28 Christophe Lyon <christophe.lyon@linaro.org> * genmultilib (combination_space): Accept '+' in option names. diff --git a/gcc/match.pd b/gcc/match.pd index c132cba..ede5504 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -642,14 +642,15 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) (minus (bit_and:cs @0 @1) (bit_and:cs @0 (bit_not @1))) (minus @1 (bit_xor @0 @1))) -/* Simplify (X & ~Y) | (~X & Y) -> X ^ Y. */ -(simplify - (bit_ior (bit_and:c @0 (bit_not @1)) (bit_and:c (bit_not @0) @1)) - (bit_xor @0 @1)) -(simplify - (bit_ior:c (bit_and @0 INTEGER_CST@2) (bit_and (bit_not @0) INTEGER_CST@1)) - (if (wi::bit_not (@2) == @1) - (bit_xor @0 @1))) +/* Simplify (X & ~Y) |^+ (~X & Y) -> X ^ Y. */ +(for op (bit_ior bit_xor plus) + (simplify + (op (bit_and:c @0 (bit_not @1)) (bit_and:c (bit_not @0) @1)) + (bit_xor @0 @1)) + (simplify + (op:c (bit_and @0 INTEGER_CST@2) (bit_and (bit_not @0) INTEGER_CST@1)) + (if (wi::bit_not (@2) == @1) + (bit_xor @0 @1)))) /* PR53979: Transform ((a ^ b) | a) -> (a | b) */ (simplify @@ -1097,6 +1098,16 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) && tree_expr_nonzero_p (@1)) (cmp @0 @2)))) +/* For integral types with wrapping overflow and C odd fold + x * C EQ/NE y * C into x EQ/NE y. */ +(for cmp (eq ne) + (simplify + (cmp (mult @0 INTEGER_CST@1) (mult @2 @1)) + (if (INTEGRAL_TYPE_P (TREE_TYPE (@1)) + && TYPE_OVERFLOW_WRAPS (TREE_TYPE (@0)) + && (TREE_INT_CST_LOW (@1) & 1) != 0) + (cmp @0 @2)))) + /* For integral types with undefined overflow and C != 0 fold x * C RELOP y * C into: diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b5d3596..2952d5c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-06-28 Marc Glisse <marc.glisse@inria.fr> + + * gcc.dg/tree-ssa/addadd.c: Remove test duplicated in addadd-2.c. + * gcc.dg/tree-ssa/mulcmp-1.c: New file. + 2017-06-28 Jakub Jelinek <jakub@redhat.com> * gcc.target/i386/cmov7.c (sgn): Renamed to ... diff --git a/gcc/testsuite/gcc.dg/tree-ssa/addadd.c b/gcc/testsuite/gcc.dg/tree-ssa/addadd.c index 16474db..454ec2a 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/addadd.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/addadd.c @@ -23,11 +23,6 @@ int i(int x){ x += __INT_MAX__; return x; } -typedef int S __attribute__((vector_size(16))); -void j(S*x){ - *x += __INT_MAX__; - *x += __INT_MAX__; -} /* { dg-final { scan-tree-dump-times " \\+ 24;" 2 "optimized" } } */ /* { dg-final { scan-tree-dump-times "\\(unsigned int\\)" 2 "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/mulcmp-1.c b/gcc/testsuite/gcc.dg/tree-ssa/mulcmp-1.c new file mode 100644 index 0000000..6ff2ff5 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/mulcmp-1.c @@ -0,0 +1,10 @@ +/* { dg-do compile } */ +/* { dg-options "-O -fdump-tree-optimized-raw" } */ + +int f(unsigned a,unsigned b){ + a *= 3; + b *= 3; + return a == b; +} + +/* { dg-final { scan-tree-dump-not "mult_expr" "optimized" } } */ |