https://gcc.gnu.org/g:2349c6a442df76acd15b6efcd70f77ecd718f46a

commit r14-11285-g2349c6a442df76acd15b6efcd70f77ecd718f46a
Author: Jakub Jelinek <ja...@redhat.com>
Date:   Fri Jan 17 11:30:07 2025 +0100

    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  <ja...@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.
    
    (cherry picked from commit 3ab9eb6946f7b832834b3d808c5617935e0be727)

Diff:
---
 gcc/match.pd                      |  2 +-
 gcc/testsuite/gcc.dg/bitint-120.c | 11 +++++++++++
 2 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/gcc/match.pd b/gcc/match.pd
index f16fdd2d7760..8465af07df8d 100644
--- a/gcc/match.pd
+++ b/gcc/match.pd
@@ -6548,7 +6548,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 000000000000..51098881e140
--- /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;
+}

Reply via email to