https://gcc.gnu.org/g:448f84a49caba91a1eb159197afb19dbf662ce15

commit r14-11147-g448f84a49caba91a1eb159197afb19dbf662ce15
Author: Jakub Jelinek <ja...@redhat.com>
Date:   Thu Nov 28 10:23:47 2024 +0100

    builtins: Handle BITINT_TYPE in __builtin_iseqsig folding [PR117802]
    
    In check_builtin_function_arguments in the _BitInt patchset I've changed
    INTEGER_TYPE tests to INTEGER_TYPE or BITINT_TYPE, but haven't done the
    same in fold_builtin_iseqsig, which now ICEs because of that.
    
    The following patch fixes that.
    
    BTW, that TYPE_PRECISION (type0) >= TYPE_PRECISION (type1) test
    for REAL_TYPE vs. REAL_TYPE looks pretty random and dangerous, I think
    it would be useful to handle this builtin also in the C and C++ FEs,
    if both arguments have REAL_TYPE, use the FE specific routine to decide
    which types to use and error if a comparison between types would be
    erroneous (e.g. complain about _Decimal* vs. float/double/long
    double/_Float*, pick up the preferred type, complain about
    __ibm128 vs. _Float128 in C++, etc.).
    But the FEs can just promote one argument to the other in that case
    and keep fold_builtin_iseqsig as is for say Fortran and other FEs.
    
    2024-11-28  Jakub Jelinek  <ja...@redhat.com>
    
            PR c/117802
            * builtins.cc (fold_builtin_iseqsig): Handle BITINT_TYPE like
            INTEGER_TYPE.
    
            * gcc.dg/builtin-iseqsig-1.c: New test.
            * gcc.dg/bitint-118.c: New test.
    
    (cherry picked from commit 88aeea14c23a5d066a635ffb4f1d2943fddcf0bd)

Diff:
---
 gcc/builtins.cc                          |  6 ++++--
 gcc/testsuite/gcc.dg/bitint-118.c        | 21 +++++++++++++++++++++
 gcc/testsuite/gcc.dg/builtin-iseqsig-1.c | 20 ++++++++++++++++++++
 3 files changed, 45 insertions(+), 2 deletions(-)

diff --git a/gcc/builtins.cc b/gcc/builtins.cc
index 77e7ade7a74d..0788f58f6371 100644
--- a/gcc/builtins.cc
+++ b/gcc/builtins.cc
@@ -9941,9 +9941,11 @@ fold_builtin_iseqsig (location_t loc, tree arg0, tree 
arg1)
     /* Choose the wider of two real types.  */
     cmp_type = TYPE_PRECISION (type0) >= TYPE_PRECISION (type1)
       ? type0 : type1;
-  else if (code0 == REAL_TYPE && code1 == INTEGER_TYPE)
+  else if (code0 == REAL_TYPE
+          && (code1 == INTEGER_TYPE || code1 == BITINT_TYPE))
     cmp_type = type0;
-  else if (code0 == INTEGER_TYPE && code1 == REAL_TYPE)
+  else if ((code0 == INTEGER_TYPE || code0 == BITINT_TYPE)
+          && code1 == REAL_TYPE)
     cmp_type = type1;
 
   arg0 = builtin_save_expr (fold_convert_loc (loc, cmp_type, arg0));
diff --git a/gcc/testsuite/gcc.dg/bitint-118.c 
b/gcc/testsuite/gcc.dg/bitint-118.c
new file mode 100644
index 000000000000..d330cc502a94
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/bitint-118.c
@@ -0,0 +1,21 @@
+/* PR c/117802 */
+/* { dg-do compile { target bitint575 } } */
+/* { dg-options "-std=c23" } */
+
+int
+foo (float x, _BitInt(8) y)
+{
+  return __builtin_iseqsig (x, y) * 2 + __builtin_iseqsig (y, x);
+}
+
+int
+bar (double x, unsigned _BitInt(162) y)
+{
+  return __builtin_iseqsig (x, y) * 2 + __builtin_iseqsig (y, x);
+}
+
+int
+baz (long double x, _BitInt(574) y)
+{
+  return __builtin_iseqsig (x, y) * 2 + __builtin_iseqsig (y, x);
+}
diff --git a/gcc/testsuite/gcc.dg/builtin-iseqsig-1.c 
b/gcc/testsuite/gcc.dg/builtin-iseqsig-1.c
new file mode 100644
index 000000000000..e9fe87b7f708
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/builtin-iseqsig-1.c
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+int
+foo (float x, int y)
+{
+  return __builtin_iseqsig (x, y) * 2 + __builtin_iseqsig (y, x);
+}
+
+int
+bar (double x, unsigned long y)
+{
+  return __builtin_iseqsig (x, y) * 2 + __builtin_iseqsig (y, x);
+}
+
+int
+baz (long double x, long long y)
+{
+  return __builtin_iseqsig (x, y) * 2 + __builtin_iseqsig (y, x);
+}

Reply via email to