From 42bd89ce072220f3569cb5e761235dcf1c675c68 Mon Sep 17 00:00:00 2001 From: Marc Glisse Date: Wed, 28 Jun 2017 11:22:30 +0200 Subject: [PATCH] Simplify 3*x == 3*y for wrapping types 2017-06-28 Marc Glisse 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 --- gcc/ChangeLog | 5 +++++ gcc/match.pd | 27 +++++++++++++++++------- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/tree-ssa/addadd.c | 5 ----- gcc/testsuite/gcc.dg/tree-ssa/mulcmp-1.c | 10 +++++++++ 5 files changed, 39 insertions(+), 13 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/mulcmp-1.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d7b45ef8c6d..51ce1bfb348 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2017-06-28 Marc Glisse + + * match.pd ((X & ~Y) | (~X & Y)): Generalize to + and ^. + (x * C EQ/NE y * C): New transformation. + 2017-06-28 Christophe Lyon * genmultilib (combination_space): Accept '+' in option names. diff --git a/gcc/match.pd b/gcc/match.pd index c132cba09cd..ede5504bdf1 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 b5d35967399..2952d5cd5ef 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-06-28 Marc Glisse + + * 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 * 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 16474db6565..454ec2a570d 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 00000000000..6ff2ff5a388 --- /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" } } */ -- 2.30.2