match.pd: Further complex simplification fixes [PR104675]
Mark mentioned in the PR further 2 simplifications that also ICE with complex types. For these, eventually (but IMO GCC 13 materials) we could support it for vector types if it would be uniform vector constants. Currently integer_pow2p is true only for INTEGER_CSTs and COMPLEX_CSTs and we can't use bit_and etc. for complex type. 2022-02-25 Jakub Jelinek <jakub@redhat.com> Marc Glisse <marc.glisse@inria.fr> PR tree-optimization/104675 * match.pd (t * 2U / 2 -> t & (~0 / 2), t / 2U * 2 -> t & ~1): Restrict simplifications to INTEGRAL_TYPE_P. * gcc.dg/pr104675-3.c : New test.
This commit is contained in:
parent
3885a122f8
commit
f62115c9b7
2 changed files with 31 additions and 2 deletions
|
@ -731,7 +731,7 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
|
|||
/* Simplify (unsigned t * 2)/2 -> unsigned t & 0x7FFFFFFF. */
|
||||
(simplify
|
||||
(trunc_div (mult @0 integer_pow2p@1) @1)
|
||||
(if (TYPE_UNSIGNED (TREE_TYPE (@0)))
|
||||
(if (INTEGRAL_TYPE_P (TREE_TYPE (@0)) && TYPE_UNSIGNED (TREE_TYPE (@0)))
|
||||
(bit_and @0 { wide_int_to_tree
|
||||
(type, wi::mask (TYPE_PRECISION (type)
|
||||
- wi::exact_log2 (wi::to_wide (@1)),
|
||||
|
@ -740,7 +740,7 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
|
|||
/* Simplify (unsigned t / 2) * 2 -> unsigned t & ~1. */
|
||||
(simplify
|
||||
(mult (trunc_div @0 integer_pow2p@1) @1)
|
||||
(if (TYPE_UNSIGNED (TREE_TYPE (@0)))
|
||||
(if (INTEGRAL_TYPE_P (TREE_TYPE (@0)) && TYPE_UNSIGNED (TREE_TYPE (@0)))
|
||||
(bit_and @0 (negate @1))))
|
||||
|
||||
/* Simplify (t * 2) / 2) -> t. */
|
||||
|
|
29
gcc/testsuite/gcc.dg/pr104675-3.c
Normal file
29
gcc/testsuite/gcc.dg/pr104675-3.c
Normal file
|
@ -0,0 +1,29 @@
|
|||
/* PR tree-optimization/104675 */
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-O2" } */
|
||||
|
||||
_Complex unsigned int
|
||||
foo (_Complex unsigned int x)
|
||||
{
|
||||
return (x / 2) * 2;
|
||||
}
|
||||
|
||||
_Complex unsigned int
|
||||
bar (_Complex unsigned int x)
|
||||
{
|
||||
return (x * 2) / 2;
|
||||
}
|
||||
|
||||
_Complex unsigned int
|
||||
baz (_Complex unsigned int x)
|
||||
{
|
||||
_Complex unsigned int y = x / 2;
|
||||
return y * 2;
|
||||
}
|
||||
|
||||
_Complex unsigned int
|
||||
qux (_Complex unsigned int x)
|
||||
{
|
||||
_Complex unsigned int y = x * 2;
|
||||
return y / 2;
|
||||
}
|
Loading…
Add table
Reference in a new issue