https://gcc.gnu.org/g:c847e54ef44c3d9e2963b3ee2da391f7876e0172

commit r17-5507-gc847e54ef44c3d9e2963b3ee2da391f7876e0172
Author: Shreesh Adiga <[email protected]>
Date:   Fri Oct 23 07:08:08 2026 -0600

    [PATCH v2] middle-end: Fix crc builtin polynomial type
    
    The crc builtins used CONST_SIZE as the polynomial type which resulted
    in polynomial argument getting truncated to 32-bits on 32-bit platform
    like ia32. GCC throws -Woverflow warnings which is how this issue was
    noticed during the previous crc64 clmul expansion work on x86.
    
    Fixed this by changing the builtin type to be specific, like UINT64
    for the crc64 ones as per documentation as well.
    Added test for ia32 as well to confirm the computed values
    as per expectation.
    
    gcc/ChangeLog:
    
            * builtin-types.def (BT_FN_UINT8_UINT8_UINT8_CONST_SIZE):
            Renamed the CONST_SIZE to be specific type like UINT8.
            (BT_FN_UINT16_UINT16_UINT8_CONST_SIZE): Likewise.
            (BT_FN_UINT16_UINT16_UINT16_CONST_SIZE): Likewise.
            (BT_FN_UINT32_UINT32_UINT8_CONST_SIZE): Likewise.
            (BT_FN_UINT32_UINT32_UINT16_CONST_SIZE): Likewise.
            (BT_FN_UINT32_UINT32_UINT32_CONST_SIZE): Likewise.
            (BT_FN_UINT64_UINT64_UINT8_CONST_SIZE): Likewise.
            (BT_FN_UINT64_UINT64_UINT16_CONST_SIZE): Likewise.
            (BT_FN_UINT64_UINT64_UINT32_CONST_SIZE): Likewise.
            (BT_FN_UINT64_UINT64_UINT64_CONST_SIZE): Likewise.
            (BT_FN_UINT8_UINT8_UINT8_UINT8): Likewise.
            (BT_FN_UINT16_UINT16_UINT8_UINT16): Likewise.
            (BT_FN_UINT16_UINT16_UINT16_UINT16): Likewise.
            (BT_FN_UINT32_UINT32_UINT8_UINT32): Likewise.
            (BT_FN_UINT32_UINT32_UINT16_UINT32): Likewise.
            (BT_FN_UINT32_UINT32_UINT32_UINT32): Likewise.
            (BT_FN_UINT64_UINT64_UINT8_UINT64): Likewise.
            (BT_FN_UINT64_UINT64_UINT16_UINT64): Likewise.
            (BT_FN_UINT64_UINT64_UINT32_UINT64): Likewise.
            (BT_FN_UINT64_UINT64_UINT64_UINT64): Likewise.
            * builtins.def (BUILT_IN_CRC8_DATA8): Used the renamed builtin
            type to have specific type like UINT8 for the polynomial arg.
            (BUILT_IN_CRC16_DATA8): Likewise.
            (BUILT_IN_CRC16_DATA16): Likewise.
            (BUILT_IN_CRC32_DATA8): Likewise.
            (BUILT_IN_CRC32_DATA16): Likewise.
            (BUILT_IN_CRC32_DATA32): Likewise.
            (BUILT_IN_CRC64_DATA8): Likewise.
            (BUILT_IN_CRC64_DATA16): Likewise.
            (BUILT_IN_CRC64_DATA32): Likewise.
            (BUILT_IN_CRC64_DATA64): Likewise.
            (BUILT_IN_REV_CRC8_DATA8): Likewise.
            (BUILT_IN_REV_CRC16_DATA8): Likewise.
            (BUILT_IN_REV_CRC16_DATA16): Likewise.
            (BUILT_IN_REV_CRC32_DATA8): Likewise.
            (BUILT_IN_REV_CRC32_DATA16): Likewise.
            (BUILT_IN_REV_CRC32_DATA32): Likewise.
            (BUILT_IN_REV_CRC64_DATA8): Likewise.
            (BUILT_IN_REV_CRC64_DATA16): Likewise.
            (BUILT_IN_REV_CRC64_DATA32): Likewise.
            (BUILT_IN_REV_CRC64_DATA64): Likewise.
    
    gcc/testsuite/ChangeLog:
    
            * gcc.target/i386/crc64-builtins-ia32.c: New test.
    
    Signed-off-by: Shreesh Adiga <[email protected]>

Diff:
---
 gcc/builtin-types.def                              | 40 ++++++-------
 gcc/builtins.def                                   | 40 ++++++-------
 .../gcc.target/i386/crc64-builtins-ia32.c          | 65 ++++++++++++++++++++++
 3 files changed, 105 insertions(+), 40 deletions(-)

diff --git a/gcc/builtin-types.def b/gcc/builtin-types.def
index 19da735791e2..aa77a52b504e 100644
--- a/gcc/builtin-types.def
+++ b/gcc/builtin-types.def
@@ -849,26 +849,26 @@ DEF_FUNCTION_TYPE_3 (BT_FN_PTR_SIZE_SIZE_PTRMODE,
                     BT_PTR, BT_SIZE, BT_SIZE, BT_PTRMODE)
 DEF_FUNCTION_TYPE_3 (BT_FN_VOID_PTR_UINT8_PTRMODE, BT_VOID, BT_PTR, BT_UINT8,
                     BT_PTRMODE)
-DEF_FUNCTION_TYPE_3 (BT_FN_UINT8_UINT8_UINT8_CONST_SIZE, BT_UINT8, BT_UINT8,
-                    BT_UINT8, BT_CONST_SIZE)
-DEF_FUNCTION_TYPE_3 (BT_FN_UINT16_UINT16_UINT8_CONST_SIZE, BT_UINT16, 
BT_UINT16,
-                    BT_UINT8, BT_CONST_SIZE)
-DEF_FUNCTION_TYPE_3 (BT_FN_UINT16_UINT16_UINT16_CONST_SIZE, BT_UINT16,
-                    BT_UINT16, BT_UINT16, BT_CONST_SIZE)
-DEF_FUNCTION_TYPE_3 (BT_FN_UINT32_UINT32_UINT8_CONST_SIZE, BT_UINT32, 
BT_UINT32,
-                    BT_UINT8, BT_CONST_SIZE)
-DEF_FUNCTION_TYPE_3 (BT_FN_UINT32_UINT32_UINT16_CONST_SIZE, BT_UINT32,
-                    BT_UINT32, BT_UINT16, BT_CONST_SIZE)
-DEF_FUNCTION_TYPE_3 (BT_FN_UINT32_UINT32_UINT32_CONST_SIZE, BT_UINT32,
-                    BT_UINT32, BT_UINT32, BT_CONST_SIZE)
-DEF_FUNCTION_TYPE_3 (BT_FN_UINT64_UINT64_UINT8_CONST_SIZE, BT_UINT64, 
BT_UINT64,
-                    BT_UINT8, BT_CONST_SIZE)
-DEF_FUNCTION_TYPE_3 (BT_FN_UINT64_UINT64_UINT16_CONST_SIZE, BT_UINT64,
-                    BT_UINT64, BT_UINT16, BT_CONST_SIZE)
-DEF_FUNCTION_TYPE_3 (BT_FN_UINT64_UINT64_UINT32_CONST_SIZE, BT_UINT64,
-                    BT_UINT64, BT_UINT32, BT_CONST_SIZE)
-DEF_FUNCTION_TYPE_3 (BT_FN_UINT64_UINT64_UINT64_CONST_SIZE, BT_UINT64,
-                    BT_UINT64, BT_UINT64, BT_CONST_SIZE)
+DEF_FUNCTION_TYPE_3 (BT_FN_UINT8_UINT8_UINT8_UINT8, BT_UINT8, BT_UINT8,
+                    BT_UINT8, BT_UINT8)
+DEF_FUNCTION_TYPE_3 (BT_FN_UINT16_UINT16_UINT8_UINT16, BT_UINT16, BT_UINT16,
+                    BT_UINT8, BT_UINT16)
+DEF_FUNCTION_TYPE_3 (BT_FN_UINT16_UINT16_UINT16_UINT16, BT_UINT16,
+                    BT_UINT16, BT_UINT16, BT_UINT16)
+DEF_FUNCTION_TYPE_3 (BT_FN_UINT32_UINT32_UINT8_UINT32, BT_UINT32, BT_UINT32,
+                    BT_UINT8, BT_UINT32)
+DEF_FUNCTION_TYPE_3 (BT_FN_UINT32_UINT32_UINT16_UINT32, BT_UINT32,
+                    BT_UINT32, BT_UINT16, BT_UINT32)
+DEF_FUNCTION_TYPE_3 (BT_FN_UINT32_UINT32_UINT32_UINT32, BT_UINT32,
+                    BT_UINT32, BT_UINT32, BT_UINT32)
+DEF_FUNCTION_TYPE_3 (BT_FN_UINT64_UINT64_UINT8_UINT64, BT_UINT64, BT_UINT64,
+                    BT_UINT8, BT_UINT64)
+DEF_FUNCTION_TYPE_3 (BT_FN_UINT64_UINT64_UINT16_UINT64, BT_UINT64,
+                    BT_UINT64, BT_UINT16, BT_UINT64)
+DEF_FUNCTION_TYPE_3 (BT_FN_UINT64_UINT64_UINT32_UINT64, BT_UINT64,
+                    BT_UINT64, BT_UINT32, BT_UINT64)
+DEF_FUNCTION_TYPE_3 (BT_FN_UINT64_UINT64_UINT64_UINT64, BT_UINT64,
+                    BT_UINT64, BT_UINT64, BT_UINT64)
 
 DEF_FUNCTION_TYPE_4 (BT_FN_SIZE_CONST_PTR_SIZE_SIZE_FILEPTR,
                     BT_SIZE, BT_CONST_PTR, BT_SIZE, BT_SIZE, BT_FILEPTR)
diff --git a/gcc/builtins.def b/gcc/builtins.def
index 4adeb440ed9d..1435ff3d0270 100644
--- a/gcc/builtins.def
+++ b/gcc/builtins.def
@@ -726,26 +726,26 @@ DEF_EXT_LIB_BUILTIN    (BUILT_IN_Y1L, "y1l", 
BT_FN_LONGDOUBLE_LONGDOUBLE, ATTR_M
 DEF_EXT_LIB_BUILTIN    (BUILT_IN_YN, "yn", BT_FN_DOUBLE_INT_DOUBLE, 
ATTR_MATHFN_FPROUNDING_ERRNO)
 DEF_EXT_LIB_BUILTIN    (BUILT_IN_YNF, "ynf", BT_FN_FLOAT_INT_FLOAT, 
ATTR_MATHFN_FPROUNDING_ERRNO)
 DEF_EXT_LIB_BUILTIN    (BUILT_IN_YNL, "ynl", BT_FN_LONGDOUBLE_INT_LONGDOUBLE, 
ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_GCC_BUILTIN               (BUILT_IN_CRC8_DATA8, "crc8_data8", 
BT_FN_UINT8_UINT8_UINT8_CONST_SIZE, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN               (BUILT_IN_CRC16_DATA8, "crc16_data8", 
BT_FN_UINT16_UINT16_UINT8_CONST_SIZE, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN               (BUILT_IN_CRC16_DATA16, "crc16_data16", 
BT_FN_UINT16_UINT16_UINT16_CONST_SIZE, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN               (BUILT_IN_CRC32_DATA8, "crc32_data8", 
BT_FN_UINT32_UINT32_UINT8_CONST_SIZE, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN               (BUILT_IN_CRC32_DATA16, "crc32_data16", 
BT_FN_UINT32_UINT32_UINT16_CONST_SIZE, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN               (BUILT_IN_CRC32_DATA32, "crc32_data32", 
BT_FN_UINT32_UINT32_UINT32_CONST_SIZE, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN               (BUILT_IN_CRC64_DATA8, "crc64_data8", 
BT_FN_UINT64_UINT64_UINT8_CONST_SIZE, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN               (BUILT_IN_CRC64_DATA16, "crc64_data16", 
BT_FN_UINT64_UINT64_UINT16_CONST_SIZE, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN               (BUILT_IN_CRC64_DATA32, "crc64_data32", 
BT_FN_UINT64_UINT64_UINT32_CONST_SIZE, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN               (BUILT_IN_CRC64_DATA64, "crc64_data64", 
BT_FN_UINT64_UINT64_UINT64_CONST_SIZE, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN               (BUILT_IN_REV_CRC8_DATA8, "rev_crc8_data8", 
BT_FN_UINT8_UINT8_UINT8_CONST_SIZE, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN               (BUILT_IN_REV_CRC16_DATA8, "rev_crc16_data8", 
BT_FN_UINT16_UINT16_UINT8_CONST_SIZE, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN               (BUILT_IN_REV_CRC16_DATA16, "rev_crc16_data16", 
BT_FN_UINT16_UINT16_UINT16_CONST_SIZE, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN               (BUILT_IN_REV_CRC32_DATA8, "rev_crc32_data8", 
BT_FN_UINT32_UINT32_UINT8_CONST_SIZE, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN               (BUILT_IN_REV_CRC32_DATA16, "rev_crc32_data16", 
BT_FN_UINT32_UINT32_UINT16_CONST_SIZE, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN               (BUILT_IN_REV_CRC32_DATA32, "rev_crc32_data32", 
BT_FN_UINT32_UINT32_UINT32_CONST_SIZE, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN               (BUILT_IN_REV_CRC64_DATA8, "rev_crc64_data8", 
BT_FN_UINT64_UINT64_UINT8_CONST_SIZE, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN               (BUILT_IN_REV_CRC64_DATA16, "rev_crc64_data16", 
BT_FN_UINT64_UINT64_UINT16_CONST_SIZE, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN               (BUILT_IN_REV_CRC64_DATA32, "rev_crc64_data32", 
BT_FN_UINT64_UINT64_UINT32_CONST_SIZE, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN               (BUILT_IN_REV_CRC64_DATA64, "rev_crc64_data64", 
BT_FN_UINT64_UINT64_UINT64_CONST_SIZE, ATTR_CONST_NOTHROW_LEAF_LIST)
+DEF_GCC_BUILTIN               (BUILT_IN_CRC8_DATA8, "crc8_data8", 
BT_FN_UINT8_UINT8_UINT8_UINT8, ATTR_CONST_NOTHROW_LEAF_LIST)
+DEF_GCC_BUILTIN               (BUILT_IN_CRC16_DATA8, "crc16_data8", 
BT_FN_UINT16_UINT16_UINT8_UINT16, ATTR_CONST_NOTHROW_LEAF_LIST)
+DEF_GCC_BUILTIN               (BUILT_IN_CRC16_DATA16, "crc16_data16", 
BT_FN_UINT16_UINT16_UINT16_UINT16, ATTR_CONST_NOTHROW_LEAF_LIST)
+DEF_GCC_BUILTIN               (BUILT_IN_CRC32_DATA8, "crc32_data8", 
BT_FN_UINT32_UINT32_UINT8_UINT32, ATTR_CONST_NOTHROW_LEAF_LIST)
+DEF_GCC_BUILTIN               (BUILT_IN_CRC32_DATA16, "crc32_data16", 
BT_FN_UINT32_UINT32_UINT16_UINT32, ATTR_CONST_NOTHROW_LEAF_LIST)
+DEF_GCC_BUILTIN               (BUILT_IN_CRC32_DATA32, "crc32_data32", 
BT_FN_UINT32_UINT32_UINT32_UINT32, ATTR_CONST_NOTHROW_LEAF_LIST)
+DEF_GCC_BUILTIN               (BUILT_IN_CRC64_DATA8, "crc64_data8", 
BT_FN_UINT64_UINT64_UINT8_UINT64, ATTR_CONST_NOTHROW_LEAF_LIST)
+DEF_GCC_BUILTIN               (BUILT_IN_CRC64_DATA16, "crc64_data16", 
BT_FN_UINT64_UINT64_UINT16_UINT64, ATTR_CONST_NOTHROW_LEAF_LIST)
+DEF_GCC_BUILTIN               (BUILT_IN_CRC64_DATA32, "crc64_data32", 
BT_FN_UINT64_UINT64_UINT32_UINT64, ATTR_CONST_NOTHROW_LEAF_LIST)
+DEF_GCC_BUILTIN               (BUILT_IN_CRC64_DATA64, "crc64_data64", 
BT_FN_UINT64_UINT64_UINT64_UINT64, ATTR_CONST_NOTHROW_LEAF_LIST)
+DEF_GCC_BUILTIN               (BUILT_IN_REV_CRC8_DATA8, "rev_crc8_data8", 
BT_FN_UINT8_UINT8_UINT8_UINT8, ATTR_CONST_NOTHROW_LEAF_LIST)
+DEF_GCC_BUILTIN               (BUILT_IN_REV_CRC16_DATA8, "rev_crc16_data8", 
BT_FN_UINT16_UINT16_UINT8_UINT16, ATTR_CONST_NOTHROW_LEAF_LIST)
+DEF_GCC_BUILTIN               (BUILT_IN_REV_CRC16_DATA16, "rev_crc16_data16", 
BT_FN_UINT16_UINT16_UINT16_UINT16, ATTR_CONST_NOTHROW_LEAF_LIST)
+DEF_GCC_BUILTIN               (BUILT_IN_REV_CRC32_DATA8, "rev_crc32_data8", 
BT_FN_UINT32_UINT32_UINT8_UINT32, ATTR_CONST_NOTHROW_LEAF_LIST)
+DEF_GCC_BUILTIN               (BUILT_IN_REV_CRC32_DATA16, "rev_crc32_data16", 
BT_FN_UINT32_UINT32_UINT16_UINT32, ATTR_CONST_NOTHROW_LEAF_LIST)
+DEF_GCC_BUILTIN               (BUILT_IN_REV_CRC32_DATA32, "rev_crc32_data32", 
BT_FN_UINT32_UINT32_UINT32_UINT32, ATTR_CONST_NOTHROW_LEAF_LIST)
+DEF_GCC_BUILTIN               (BUILT_IN_REV_CRC64_DATA8, "rev_crc64_data8", 
BT_FN_UINT64_UINT64_UINT8_UINT64, ATTR_CONST_NOTHROW_LEAF_LIST)
+DEF_GCC_BUILTIN               (BUILT_IN_REV_CRC64_DATA16, "rev_crc64_data16", 
BT_FN_UINT64_UINT64_UINT16_UINT64, ATTR_CONST_NOTHROW_LEAF_LIST)
+DEF_GCC_BUILTIN               (BUILT_IN_REV_CRC64_DATA32, "rev_crc64_data32", 
BT_FN_UINT64_UINT64_UINT32_UINT64, ATTR_CONST_NOTHROW_LEAF_LIST)
+DEF_GCC_BUILTIN               (BUILT_IN_REV_CRC64_DATA64, "rev_crc64_data64", 
BT_FN_UINT64_UINT64_UINT64_UINT64, ATTR_CONST_NOTHROW_LEAF_LIST)
 /* Category: _Complex math builtins.  */
 DEF_C99_COMPL_BUILTIN        (BUILT_IN_CABS, "cabs", 
BT_FN_DOUBLE_COMPLEX_DOUBLE, ATTR_MATHFN_FPROUNDING)
 DEF_C99_COMPL_BUILTIN        (BUILT_IN_CABSF, "cabsf", 
BT_FN_FLOAT_COMPLEX_FLOAT, ATTR_MATHFN_FPROUNDING)
diff --git a/gcc/testsuite/gcc.target/i386/crc64-builtins-ia32.c 
b/gcc/testsuite/gcc.target/i386/crc64-builtins-ia32.c
new file mode 100644
index 000000000000..1339060e92f4
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/crc64-builtins-ia32.c
@@ -0,0 +1,65 @@
+/* { dg-do compile { target ia32 } } */
+/* { dg-additional-options "-O2 -std=c99 -fdump-tree-optimized" } */
+
+#include <stdint.h>
+
+uint64_t crc64_data8 ()
+{
+  return __builtin_crc64_data8 (0xffffffffffffffffULL, 0x32,
+                               0x40021234002123ULL);
+}
+
+uint64_t crc64_data16 ()
+{
+  return __builtin_crc64_data16 (0xffffffffffffffffULL, 0x3232,
+                                0x40021234002123ULL);
+}
+
+uint64_t crc64_data32 ()
+{
+  return __builtin_crc64_data32 (0xffffffffffffffffULL, 0x123546ff,
+                                0x40021234002123ULL);
+}
+
+uint64_t crc64_data64 ()
+{
+  return __builtin_crc64_data64 (0xffffffffffffffffULL, 0x123546ff123546ffULL,
+                                0x40021234002123ULL);
+}
+
+uint64_t rev_crc64_data8 ()
+{
+  return __builtin_rev_crc64_data8 (0xffffffffffffffffULL, 0x32,
+                                   0x40021234002123ULL);
+}
+
+uint64_t rev_crc64_data16 ()
+{
+  return __builtin_rev_crc64_data16 (0xffffffffffffffffULL, 0x3232,
+                                    0x40021234002123ULL);
+}
+
+uint64_t rev_crc64_data32 ()
+{
+  return __builtin_rev_crc64_data32 (0xffffffffffffffffULL, 0x123546ff,
+                                    0x40021234002123ULL);
+}
+
+uint64_t rev_crc64_data64 ()
+{
+  return __builtin_rev_crc64_data64 (0xffffffffffffffffULL,
+                                    0x123546ff123546ffULL,
+                                    0x40021234002123ULL);
+}
+
+/* Test that crc64 builtins polynomial arg doesn't get truncated
+   to 32-bit on ia32 and computes expected values.  */
+
+/* { dg-final { scan-tree-dump-times "return 14753344481753729783;" 1 
"optimized" } } */
+/* { dg-final { scan-tree-dump-times "return 9361103135052257218;" 1 
"optimized" } } */
+/* { dg-final { scan-tree-dump-times "return 2386776299826502735;" 1 
"optimized" } } */
+/* { dg-final { scan-tree-dump-times "return 16682003383967693607;" 1 
"optimized" } } */
+/* { dg-final { scan-tree-dump-times "return 12528055141939117259;" 1 
"optimized" } } */
+/* { dg-final { scan-tree-dump-times "return 9375109733926652568;" 1 
"optimized" } } */
+/* { dg-final { scan-tree-dump-times "return 13461549257995699439;" 1 
"optimized" } } */
+/* { dg-final { scan-tree-dump-times "return 16230122087500358547;" 1 
"optimized" } } */

Reply via email to