[gcc r17-2894] mips: Fix up creation of MD builtins with 0 arguments [PR126484]

Jakub Jelinek via Gcc-cvs <[email protected]> Mon, 3 Aug 2026 09:28:11 +0000 (GMT)
Newsgroups gmane.comp.gcc.cvs
Message-ID <[email protected]>
https://gcc.gnu.org/g:e152b584c3df7ce0ef738f3d7c2d852490d59e3d

commit r17-2894-ge152b584c3df7ce0ef738f3d7c2d852490d59e3d
Author: Jakub Jelinek <[email protected]>
Date:   Mon Aug 3 11:26:11 2026 +0200

    mips: Fix up creation of MD builtins with 0 arguments [PR126484]
    
    For MIPS_SI_FTYPE_VOID and MIPS_USI_FTYPE_VOID which are meant
    for functions which return (SImode) int or unsigned int and have
    (void) arguments the MIPS backend creates those using
    case MIPS_SI_FTYPE_VOID: types[(int) type] = build_function_type_list (intSI_type_node, void_type_node, NULL_TREE); break;
    case MIPS_USI_FTYPE_VOID: types[(int) type] = build_function_type_list (unsigned_intSI_type_node, void_type_node, NULL_TREE); break;
    That is wrong, because functions which don't take any arguments
    (i.e. (void) or C23/C++ ()) should be using void_list_node as
    TYPE_ARG_TYPES, not a TREE_LIST with void_type_node TREE_VALUE
    and TREE_CHAIN being that void_list_node.  Although void_list_node
    also has TREE_VALUE of void_type_node, various places in the C++
    FE as well as in the middle-end rely on void_list_node to be unique,
    compare it using pointer comparison.
    The following testcase strangely happens to compile fine when compiled
    in C, but fails in C++ (which reports wrong number of arguments due
    to this bug).
    
    The following simple patch just arranges those 0 argument functions
    to have the MIPS_*_FTYPE_VOID enumerators be named as before, but
    in the build_function_type_list call omit that ", void_type_node" part,
    so it creates correct 0 arguments FUNCTION_TYPE.
    
    2026-08-03  Jakub Jelinek  <[email protected]>
    
            PR target/126484
            * config/mips/mips-ftypes.def (MIPS_SI_FTYPE_VOID,
            MIPS_USI_FTYPE_VOID): Use DEF_MIPS_FTYPE with 0 as
            first argument rather than 1 and leave out ", VOID" from
            second argument.
            * config/mips/mips.cc (MIPS_FTYPE_NAME0): Define.
            (MIPS_FTYPE_ATYPES0): Define.
    
            * g++.target/mips/pr126484.C: New test.
    
    Reviewed-by: Richard Biener <[email protected]>

Diff:
---
 gcc/config/mips/mips-ftypes.def          | 4 ++--
 gcc/config/mips/mips.cc                  | 4 ++++
 gcc/testsuite/g++.target/mips/pr126484.C | 8 ++++++++
 3 files changed, 14 insertions(+), 2 deletions(-)

diff --git a/gcc/config/mips/mips-ftypes.def b/gcc/config/mips/mips-ftypes.def
index fb72661c6822..94f5c5ddf0eb 100644
--- a/gcc/config/mips/mips-ftypes.def
+++ b/gcc/config/mips/mips-ftypes.def
@@ -75,7 +75,7 @@ DEF_MIPS_FTYPE (1, (SI, V4QI))
 DEF_MIPS_FTYPE (2, (SI, V4QI, V4QI))
 DEF_MIPS_FTYPE (2, (SI, V4SI, UQI))
 DEF_MIPS_FTYPE (2, (SI, V8HI, UQI))
-DEF_MIPS_FTYPE (1, (SI, VOID))
+DEF_MIPS_FTYPE (0, (SI))
 
 DEF_MIPS_FTYPE (2, (UDI, UDI, UDI))
 DEF_MIPS_FTYPE (2, (UDI, UV2SI, UV2SI))
@@ -84,7 +84,7 @@ DEF_MIPS_FTYPE (2, (UDI, V2DI, UQI))
 DEF_MIPS_FTYPE (2, (USI, V16QI, UQI))
 DEF_MIPS_FTYPE (2, (USI, V4SI, UQI))
 DEF_MIPS_FTYPE (2, (USI, V8HI, UQI))
-DEF_MIPS_FTYPE (1, (USI, VOID))
+DEF_MIPS_FTYPE (0, (USI))
 
 DEF_MIPS_FTYPE (2, (UV16QI, UV16QI, UQI))
 DEF_MIPS_FTYPE (2, (UV16QI, UV16QI, UV16QI))
diff --git a/gcc/config/mips/mips.cc b/gcc/config/mips/mips.cc
index 80828ed20afc..af9ae9f550e5 100644
--- a/gcc/config/mips/mips.cc
+++ b/gcc/config/mips/mips.cc
@@ -211,6 +211,7 @@ enum mips_ucbranch_type
 };
 
 /* Macros to create an enumeration identifier for a function prototype.  */
+#define MIPS_FTYPE_NAME0(A) MIPS_##A##_FTYPE_VOID
 #define MIPS_FTYPE_NAME1(A, B) MIPS_##A##_FTYPE_##B
 #define MIPS_FTYPE_NAME2(A, B, C) MIPS_##A##_FTYPE_##B##_##C
 #define MIPS_FTYPE_NAME3(A, B, C, D) MIPS_##A##_FTYPE_##B##_##C##_##D
@@ -17137,6 +17138,9 @@ mips_build_cvpointer_type (void)
 
 /* MIPS_FTYPE_ATYPESN takes N MIPS_FTYPES-like type codes and lists
    their associated MIPS_ATYPEs.  */
+#define MIPS_FTYPE_ATYPES0(A) \
+  MIPS_ATYPE_##A
+
 #define MIPS_FTYPE_ATYPES1(A, B) \
   MIPS_ATYPE_##A, MIPS_ATYPE_##B
 
diff --git a/gcc/testsuite/g++.target/mips/pr126484.C b/gcc/testsuite/g++.target/mips/pr126484.C
new file mode 100644
index 000000000000..2d55cb939c0d
--- /dev/null
+++ b/gcc/testsuite/g++.target/mips/pr126484.C
@@ -0,0 +1,8 @@
+// PR target/126484
+// { dg-do compile }
+
+int
+foo ()
+{
+  return __builtin_mips_get_fcsr ();
+}