[llvm] [Intrinsic] Add IIT_STRUCTn to support more than 9 return values (PR #160434)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Sep 23 20:21:54 PDT 2025
https://github.com/darkbuck updated https://github.com/llvm/llvm-project/pull/160434
>From 1829b705713baa68a2d33eba1feb4bc871cca866 Mon Sep 17 00:00:00 2001
From: Michael Liao <michael.hliao at gmail.com>
Date: Tue, 23 Sep 2025 11:11:42 -0400
Subject: [PATCH] [Intrinsic] Add IIT_STRUCTn to support more than 9 return
values
- Intrinsic could only have up to 9 return values so far. In case new
intrinsics may require more than 9 return values, additional
`ITT_STRUCTxxx` may be added following previous efforts supporting
more return values.
- Instead, this patch addes a new type info `IIT_STRUCTn` followed by a
BYTE specifying the total return values (minus 10) so that we could
support up to maximally 265 return values without introducing more
encodings in that type info byte.
---
llvm/include/llvm/IR/Intrinsics.td | 5 ++-
llvm/lib/IR/Intrinsics.cpp | 3 ++
llvm/test/TableGen/intrinsic-struct.td | 31 +++++++++++++++----
.../TableGen/Basic/CodeGenIntrinsics.cpp | 2 +-
4 files changed, 33 insertions(+), 8 deletions(-)
diff --git a/llvm/include/llvm/IR/Intrinsics.td b/llvm/include/llvm/IR/Intrinsics.td
index 585371a6a4423..541f1bccdfe1a 100644
--- a/llvm/include/llvm/IR/Intrinsics.td
+++ b/llvm/include/llvm/IR/Intrinsics.td
@@ -337,6 +337,7 @@ def IIT_V6 : IIT_Vec<6, 60>;
def IIT_V10 : IIT_Vec<10, 61>;
def IIT_V2048 : IIT_Vec<2048, 62>;
def IIT_V4096 : IIT_Vec<4096, 63>;
+def IIT_STRUCTn : IIT_Base<64>;
}
defvar IIT_all_FixedTypes = !filter(iit, IIT_all,
@@ -663,7 +664,9 @@ class TypeInfoGen<
!if(!isa<LLVMMatchType>(ty), ACTys[MappingRIdxs[ty.Number]], ty));
list<int> TypeSig = !listflatten(!listconcat(
- [IIT_RetNumbers[!size(RetTypes)]],
+ [!cond(
+ !lt(!size(RetTypes), !size(IIT_RetNumbers)): IIT_RetNumbers[!size(RetTypes)],
+ true: [IIT_STRUCTn.Number, !sub(!size(RetTypes), !size(IIT_RetNumbers))])],
!foreach(i, !range(AllTypes),
!foreach(a, AllTypes[i].Sig,
ResolveArgCode<
diff --git a/llvm/lib/IR/Intrinsics.cpp b/llvm/lib/IR/Intrinsics.cpp
index 4d2e8fadff4f7..7298141f8b695 100644
--- a/llvm/lib/IR/Intrinsics.cpp
+++ b/llvm/lib/IR/Intrinsics.cpp
@@ -390,6 +390,9 @@ DecodeIITType(unsigned &NextElt, ArrayRef<unsigned char> Infos,
case IIT_EMPTYSTRUCT:
OutputTable.push_back(IITDescriptor::get(IITDescriptor::Struct, 0));
return;
+ case IIT_STRUCTn:
+ StructElts += Infos[NextElt++] + 1;
+ [[fallthrough]];
case IIT_STRUCT9:
++StructElts;
[[fallthrough]];
diff --git a/llvm/test/TableGen/intrinsic-struct.td b/llvm/test/TableGen/intrinsic-struct.td
index 467fd9057c183..c5ee2c3087ca2 100644
--- a/llvm/test/TableGen/intrinsic-struct.td
+++ b/llvm/test/TableGen/intrinsic-struct.td
@@ -1,22 +1,41 @@
// RUN: llvm-tblgen -gen-intrinsic-enums -I %p/../../include %s -DTEST_INTRINSICS_SUPPRESS_DEFS | FileCheck %s --check-prefix=CHECK-ENUM
-// RUN: llvm-tblgen -gen-intrinsic-impl -I %p/../../include %s -DTEST_INTRINSICS_SUPPRESS_DEFS > /dev/null 2>&1
+// RUN: llvm-tblgen -gen-intrinsic-impl -I %p/../../include %s -DTEST_INTRINSICS_SUPPRESS_DEFS | FileCheck %s --check-prefix=CHECK-IMPL
// RUN: not llvm-tblgen -gen-intrinsic-impl -I %p/../../include %s -DTEST_INTRINSICS_SUPPRESS_DEFS -DENABLE_ERROR 2>&1 | FileCheck %s --check-prefix=CHECK-ERROR
// XFAIL: vg_leak
include "llvm/IR/Intrinsics.td"
-// Make sure we can return up to 9 values.
-// CHECK-ENUM: returns_9_results = {{[0-9]+}}, // llvm.returns.9.results
+// Make sure we can return up to 265 values. Intrinsics are in alphabetical order.
+// CHECK-ENUM: returns_10_results = {{[0-9]+}}, // llvm.returns.10.results
+// CHECK-ENUM: returns_265_results, // llvm.returns.265.results
+// CHECK-ENUM: returns_9_results, // llvm.returns.9.results
+
+// Make sure the encoding table is correctly generated. Intrinsics are in reverse alphabetical order.
+// CHECK-IMPL: IIT_LongEncodingTable
+// CHECK-IMPL-NEXT: 49,
+// CHECK-IMPL-SAME: 15, 1, 15, 9, 15, 17, 15, 25, 15, 33, 15, 41, 15, 49, 15, 57, 15, 65, 0
+// CHECK-IMPL-NEXT: 64, 255
+// CHECK-IMPL-SAME: 15, 1, 15, 9, 15, 17, 15, 25, 15, 33, 15, 41, 15, 49, 15, 57, 15, 65, 15, 73, 15, 81,
+// CHECK-IMPL-NEXT: 64, 0
+// CHECK-IMPL-SAME: 15, 1, 15, 9, 15, 17, 15, 25, 15, 33, 15, 41, 15, 49, 15, 57, 15, 65, 15, 73, 0
def int_returns_9_results : Intrinsic<
!listsplat(llvm_anyint_ty, 9),
[], [], "llvm.returns.9.results">;
-#ifdef ENABLE_ERROR
-// CHECK-ERROR: error: intrinsics can only return upto 9 values, 'int_returns_10_results' returns 10 values
-// CHECK-ERROR-NEXT: def int_returns_10_results : Intrinsic<
def int_returns_10_results : Intrinsic<
!listsplat(llvm_anyint_ty, 10),
[], [], "llvm.returns.10.results">;
+def int_returns_265_results : Intrinsic<
+ !listsplat(llvm_anyint_ty, 265),
+ [], [], "llvm.returns.265.results">;
+
+#ifdef ENABLE_ERROR
+// CHECK-ERROR: error: intrinsics can only return upto 265 values, 'int_returns_266_results' returns 266 values
+// CHECK-ERROR-NEXT: def int_returns_266_results : Intrinsic<
+def int_returns_266_results : Intrinsic<
+ !listsplat(llvm_anyint_ty, 266),
+ [], [], "llvm.returns.10.results">;
+
#endif
diff --git a/llvm/utils/TableGen/Basic/CodeGenIntrinsics.cpp b/llvm/utils/TableGen/Basic/CodeGenIntrinsics.cpp
index bc42efa3b2e9c..0a64a5cbfb154 100644
--- a/llvm/utils/TableGen/Basic/CodeGenIntrinsics.cpp
+++ b/llvm/utils/TableGen/Basic/CodeGenIntrinsics.cpp
@@ -37,7 +37,7 @@ CodeGenIntrinsicContext::CodeGenIntrinsicContext(const RecordKeeper &RC) {
dyn_cast_or_null<ListInit>(RC.getGlobal("IIT_RetNumbers"));
if (!IIT_RetNumbers)
PrintFatalError("unable to find 'IIT_RetNumbers' list");
- MaxNumReturn = IIT_RetNumbers->size() - 1;
+ MaxNumReturn = IIT_RetNumbers->size() - 1 + /*IIT_STRUCTn*/ 256;
}
CodeGenIntrinsicTable::CodeGenIntrinsicTable(const RecordKeeper &RC) {
More information about the llvm-commits
mailing list