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:
Jakub Jelinek 2022-02-25 21:25:12 +01:00
parent 3885a122f8
commit f62115c9b7
2 changed files with 31 additions and 2 deletions

View File

@ -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. */

View 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;
}