Commit 42bd89ce by Marc Glisse Committed by Marc Glisse

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
parent 883312dc
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> 2017-06-28 Christophe Lyon <christophe.lyon@linaro.org>
* genmultilib (combination_space): Accept '+' in option names. * genmultilib (combination_space): Accept '+' in option names.
......
...@@ -642,14 +642,15 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) ...@@ -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 (bit_and:cs @0 @1) (bit_and:cs @0 (bit_not @1)))
(minus @1 (bit_xor @0 @1))) (minus @1 (bit_xor @0 @1)))
/* Simplify (X & ~Y) | (~X & Y) -> X ^ Y. */ /* Simplify (X & ~Y) |^+ (~X & Y) -> X ^ Y. */
(simplify (for op (bit_ior bit_xor plus)
(bit_ior (bit_and:c @0 (bit_not @1)) (bit_and:c (bit_not @0) @1)) (simplify
(bit_xor @0 @1)) (op (bit_and:c @0 (bit_not @1)) (bit_and:c (bit_not @0) @1))
(simplify (bit_xor @0 @1))
(bit_ior:c (bit_and @0 INTEGER_CST@2) (bit_and (bit_not @0) INTEGER_CST@1)) (simplify
(if (wi::bit_not (@2) == @1) (op:c (bit_and @0 INTEGER_CST@2) (bit_and (bit_not @0) INTEGER_CST@1))
(bit_xor @0 @1))) (if (wi::bit_not (@2) == @1)
(bit_xor @0 @1))))
/* PR53979: Transform ((a ^ b) | a) -> (a | b) */ /* PR53979: Transform ((a ^ b) | a) -> (a | b) */
(simplify (simplify
...@@ -1097,6 +1098,16 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) ...@@ -1097,6 +1098,16 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
&& tree_expr_nonzero_p (@1)) && tree_expr_nonzero_p (@1))
(cmp @0 @2)))) (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 /* For integral types with undefined overflow and C != 0 fold
x * C RELOP y * C into: x * C RELOP y * C into:
......
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> 2017-06-28 Jakub Jelinek <jakub@redhat.com>
* gcc.target/i386/cmov7.c (sgn): Renamed to ... * gcc.target/i386/cmov7.c (sgn): Renamed to ...
......
...@@ -23,11 +23,6 @@ int i(int x){ ...@@ -23,11 +23,6 @@ int i(int x){
x += __INT_MAX__; x += __INT_MAX__;
return x; 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 " \\+ 24;" 2 "optimized" } } */
/* { dg-final { scan-tree-dump-times "\\(unsigned int\\)" 2 "optimized" } } */ /* { dg-final { scan-tree-dump-times "\\(unsigned int\\)" 2 "optimized" } } */
......
/* { 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" } } */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment