aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2022-02-25 21:25:12 +0100
committerJakub Jelinek <jakub@redhat.com>2022-02-25 21:25:12 +0100
commitf62115c9b770a66c5378f78a2d5866243d560573 (patch)
tree4f146144ce3374279e18a7cd84442201fb71c3d0 /gcc
parent3885a122f817a1b6dca4a84ba9e020d5ab2060af (diff)
downloadgcc-f62115c9b770a66c5378f78a2d5866243d560573.zip
gcc-f62115c9b770a66c5378f78a2d5866243d560573.tar.gz
gcc-f62115c9b770a66c5378f78a2d5866243d560573.tar.bz2
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.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/match.pd4
-rw-r--r--gcc/testsuite/gcc.dg/pr104675-3.c29
2 files changed, 31 insertions, 2 deletions
diff --git a/gcc/match.pd b/gcc/match.pd
index 0bd0ac8..97399e5 100644
--- a/gcc/match.pd
+++ b/gcc/match.pd
@@ -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. */
diff --git a/gcc/testsuite/gcc.dg/pr104675-3.c b/gcc/testsuite/gcc.dg/pr104675-3.c
new file mode 100644
index 0000000..3b2eb64
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr104675-3.c
@@ -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;
+}