aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2025-01-17 11:30:07 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2025-01-17 11:30:07 +0100
commit3ab9eb6946f7b832834b3d808c5617935e0be727 (patch)
tree34cbc4dd3ce71a28f97bb6d227d4da05d730ca10
parentb5a069203fc074ab75d994c4a7e0f2db6a0a00fd (diff)
downloadgcc-3ab9eb6946f7b832834b3d808c5617935e0be727.zip
gcc-3ab9eb6946f7b832834b3d808c5617935e0be727.tar.gz
gcc-3ab9eb6946f7b832834b3d808c5617935e0be727.tar.bz2
match.pd: Fix (FTYPE) N CMP (FTYPE) M optimization for GENERIC [PR118522]
The last case of this optimization assumes that if 2 integral types have same precision and TYPE_UNSIGNED, then they are uselessly convertible. While that is very likely the case for GIMPLE, it is not the case for GENERIC, so the following patch adds there a convert so that the optimization produces also valid GENERIC. Without it we got (int) p == b where b had _BitInt(32) type, so incompatible types. 2025-01-17 Jakub Jelinek <jakub@redhat.com> PR tree-optimization/118522 * match.pd ((FTYPE) N CMP (FTYPE) M): Add convert, as in GENERIC integral types with the same precision and sign might actually not be compatible types. * gcc.dg/bitint-120.c: New test.
-rw-r--r--gcc/match.pd2
-rw-r--r--gcc/testsuite/gcc.dg/bitint-120.c11
2 files changed, 12 insertions, 1 deletions
diff --git a/gcc/match.pd b/gcc/match.pd
index b6cbb85..f4359d3 100644
--- a/gcc/match.pd
+++ b/gcc/match.pd
@@ -7253,7 +7253,7 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
(icmp (convert:type2 @1) @2)
(if (TYPE_PRECISION (type1) == TYPE_PRECISION (type2)
&& type1_signed_p == type2_signed_p)
- (icmp @1 @2))))))))))
+ (icmp @1 (convert @2)))))))))))
/* Optimize various special cases of (FTYPE) N CMP CST. */
(for cmp (lt le eq ne ge gt)
diff --git a/gcc/testsuite/gcc.dg/bitint-120.c b/gcc/testsuite/gcc.dg/bitint-120.c
new file mode 100644
index 0000000..5109888
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/bitint-120.c
@@ -0,0 +1,11 @@
+/* PR tree-optimization/118522 */
+/* { dg-do compile { target bitint } } */
+/* { dg-options "-O2" } */
+
+_BitInt(32) b;
+
+int
+foo (unsigned short p)
+{
+ return p == (double) b;
+}