Skip to content

Commit d234955

Browse files
darkbuckgithub-actions[bot]
authored andcommitted
Automerge: [Intrinsic] Unify IIT_STRUCT{2-9} into ITT_STRUCT to support upto 257 return values
- Currently, Intrinsic can only have up to 9 return values. In case new intrinsics require more than 9 return values, additional ITT_STRUCTxxx values need to be added to support > 9 return values. Instead, this patch unifies them into a single IIT_STRUCT followed by a BYTE specifying the minimal 2 (encoded as 0) and maximal 257 (encoded as 255) return values.
2 parents 1129072 + 9d7628d commit d234955

File tree

6 files changed

+98
-105
lines changed

6 files changed

+98
-105
lines changed

llvm/include/llvm/IR/Intrinsics.td

Lines changed: 37 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -297,46 +297,39 @@ def IIT_MMX : IIT_VT<x86mmx, 17>;
297297
def IIT_TOKEN : IIT_VT<token, 18>;
298298
def IIT_METADATA : IIT_VT<MetadataVT, 19>;
299299
def IIT_EMPTYSTRUCT : IIT_VT<OtherVT, 20>;
300-
def IIT_STRUCT2 : IIT_Base<21>;
301-
def IIT_STRUCT3 : IIT_Base<22>;
302-
def IIT_STRUCT4 : IIT_Base<23>;
303-
def IIT_STRUCT5 : IIT_Base<24>;
304-
def IIT_EXTEND_ARG : IIT_Base<25>;
305-
def IIT_TRUNC_ARG : IIT_Base<26>;
306-
def IIT_ANYPTR : IIT_Base<27>;
307-
def IIT_V1 : IIT_Vec<1, 28>;
308-
def IIT_VARARG : IIT_VT<isVoid, 29>;
309-
def IIT_ONE_NTH_ELTS_VEC_ARG : IIT_Base<30>;
310-
def IIT_SAME_VEC_WIDTH_ARG : IIT_Base<31>;
311-
def IIT_VEC_OF_ANYPTRS_TO_ELT : IIT_Base<34>;
312-
def IIT_I128 : IIT_Int<128, 35>;
313-
def IIT_V512 : IIT_Vec<512, 36>;
314-
def IIT_V1024 : IIT_Vec<1024, 37>;
315-
def IIT_STRUCT6 : IIT_Base<38>;
316-
def IIT_STRUCT7 : IIT_Base<39>;
317-
def IIT_STRUCT8 : IIT_Base<40>;
318-
def IIT_F128 : IIT_VT<f128, 41>;
319-
def IIT_VEC_ELEMENT : IIT_Base<42>;
320-
def IIT_SCALABLE_VEC : IIT_Base<43>;
321-
def IIT_SUBDIVIDE2_ARG : IIT_Base<44>;
322-
def IIT_SUBDIVIDE4_ARG : IIT_Base<45>;
323-
def IIT_VEC_OF_BITCASTS_TO_INT : IIT_Base<46>;
324-
def IIT_V128 : IIT_Vec<128, 47>;
325-
def IIT_BF16 : IIT_VT<bf16, 48>;
326-
def IIT_STRUCT9 : IIT_Base<49>;
327-
def IIT_V256 : IIT_Vec<256, 50>;
328-
def IIT_AMX : IIT_VT<x86amx, 51>;
329-
def IIT_PPCF128 : IIT_VT<ppcf128, 52>;
330-
def IIT_V3 : IIT_Vec<3, 53>;
331-
def IIT_EXTERNREF : IIT_VT<externref, 54>;
332-
def IIT_FUNCREF : IIT_VT<funcref, 55>;
333-
def IIT_I2 : IIT_Int<2, 57>;
334-
def IIT_I4 : IIT_Int<4, 58>;
335-
def IIT_AARCH64_SVCOUNT : IIT_VT<aarch64svcount, 59>;
336-
def IIT_V6 : IIT_Vec<6, 60>;
337-
def IIT_V10 : IIT_Vec<10, 61>;
338-
def IIT_V2048 : IIT_Vec<2048, 62>;
339-
def IIT_V4096 : IIT_Vec<4096, 63>;
300+
def IIT_STRUCT : IIT_Base<21>;
301+
def IIT_EXTEND_ARG : IIT_Base<22>;
302+
def IIT_TRUNC_ARG : IIT_Base<23>;
303+
def IIT_ANYPTR : IIT_Base<24>;
304+
def IIT_V1 : IIT_Vec<1, 25>;
305+
def IIT_VARARG : IIT_VT<isVoid, 26>;
306+
def IIT_ONE_NTH_ELTS_VEC_ARG : IIT_Base<27>;
307+
def IIT_SAME_VEC_WIDTH_ARG : IIT_Base<28>;
308+
def IIT_VEC_OF_ANYPTRS_TO_ELT : IIT_Base<29>;
309+
def IIT_I128 : IIT_Int<128, 30>;
310+
def IIT_V512 : IIT_Vec<512, 31>;
311+
def IIT_V1024 : IIT_Vec<1024, 32>;
312+
def IIT_F128 : IIT_VT<f128, 33>;
313+
def IIT_VEC_ELEMENT : IIT_Base<34>;
314+
def IIT_SCALABLE_VEC : IIT_Base<35>;
315+
def IIT_SUBDIVIDE2_ARG : IIT_Base<36>;
316+
def IIT_SUBDIVIDE4_ARG : IIT_Base<37>;
317+
def IIT_VEC_OF_BITCASTS_TO_INT : IIT_Base<38>;
318+
def IIT_V128 : IIT_Vec<128, 39>;
319+
def IIT_BF16 : IIT_VT<bf16, 40>;
320+
def IIT_V256 : IIT_Vec<256, 41>;
321+
def IIT_AMX : IIT_VT<x86amx, 42>;
322+
def IIT_PPCF128 : IIT_VT<ppcf128, 43>;
323+
def IIT_V3 : IIT_Vec<3, 44>;
324+
def IIT_EXTERNREF : IIT_VT<externref, 45>;
325+
def IIT_FUNCREF : IIT_VT<funcref, 46>;
326+
def IIT_I2 : IIT_Int<2, 47>;
327+
def IIT_I4 : IIT_Int<4, 48>;
328+
def IIT_AARCH64_SVCOUNT : IIT_VT<aarch64svcount, 49>;
329+
def IIT_V6 : IIT_Vec<6, 50>;
330+
def IIT_V10 : IIT_Vec<10, 51>;
331+
def IIT_V2048 : IIT_Vec<2048, 52>;
332+
def IIT_V4096 : IIT_Vec<4096, 53>;
340333
}
341334

342335
defvar IIT_all_FixedTypes = !filter(iit, IIT_all,
@@ -345,19 +338,6 @@ defvar IIT_all_FixedTypes = !filter(iit, IIT_all,
345338
defvar IIT_all_VectorTypes = !filter(iit, IIT_all,
346339
!isa<IIT_Vec>(iit));
347340

348-
defvar IIT_RetNumbers = [
349-
[IIT_Done.Number],
350-
[]<int>,
351-
[IIT_STRUCT2.Number],
352-
[IIT_STRUCT3.Number],
353-
[IIT_STRUCT4.Number],
354-
[IIT_STRUCT5.Number],
355-
[IIT_STRUCT6.Number],
356-
[IIT_STRUCT7.Number],
357-
[IIT_STRUCT8.Number],
358-
[IIT_STRUCT9.Number],
359-
];
360-
361341
//===----------------------------------------------------------------------===//
362342
// Types used by intrinsics.
363343
//===----------------------------------------------------------------------===//
@@ -663,7 +643,10 @@ class TypeInfoGen<
663643
!if(!isa<LLVMMatchType>(ty), ACTys[MappingRIdxs[ty.Number]], ty));
664644

665645
list<int> TypeSig = !listflatten(!listconcat(
666-
[IIT_RetNumbers[!size(RetTypes)]],
646+
[!cond(
647+
!eq(!size(RetTypes), 0): [IIT_Done.Number],
648+
!eq(!size(RetTypes), 1): []<int>,
649+
true: [IIT_STRUCT.Number, !sub(!size(RetTypes), 2)])],
667650
!foreach(i, !range(AllTypes),
668651
!foreach(a, AllTypes[i].Sig,
669652
ResolveArgCode<

llvm/lib/IR/Intrinsics.cpp

Lines changed: 3 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,6 @@ DecodeIITType(unsigned &NextElt, ArrayRef<unsigned char> Infos,
207207
bool IsScalableVector = (LastInfo == IIT_SCALABLE_VEC);
208208

209209
IIT_Info Info = IIT_Info(Infos[NextElt++]);
210-
unsigned StructElts = 2;
211210

212211
switch (Info) {
213212
case IIT_Done:
@@ -390,28 +389,9 @@ DecodeIITType(unsigned &NextElt, ArrayRef<unsigned char> Infos,
390389
case IIT_EMPTYSTRUCT:
391390
OutputTable.push_back(IITDescriptor::get(IITDescriptor::Struct, 0));
392391
return;
393-
case IIT_STRUCT9:
394-
++StructElts;
395-
[[fallthrough]];
396-
case IIT_STRUCT8:
397-
++StructElts;
398-
[[fallthrough]];
399-
case IIT_STRUCT7:
400-
++StructElts;
401-
[[fallthrough]];
402-
case IIT_STRUCT6:
403-
++StructElts;
404-
[[fallthrough]];
405-
case IIT_STRUCT5:
406-
++StructElts;
407-
[[fallthrough]];
408-
case IIT_STRUCT4:
409-
++StructElts;
410-
[[fallthrough]];
411-
case IIT_STRUCT3:
412-
++StructElts;
413-
[[fallthrough]];
414-
case IIT_STRUCT2: {
392+
case IIT_STRUCT: {
393+
unsigned StructElts = Infos[NextElt++] + 2;
394+
415395
OutputTable.push_back(
416396
IITDescriptor::get(IITDescriptor::Struct, StructElts));
417397

Lines changed: 47 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,58 @@
11
// RUN: llvm-tblgen -gen-intrinsic-enums -I %p/../../include %s -DTEST_INTRINSICS_SUPPRESS_DEFS | FileCheck %s --check-prefix=CHECK-ENUM
2-
// RUN: llvm-tblgen -gen-intrinsic-impl -I %p/../../include %s -DTEST_INTRINSICS_SUPPRESS_DEFS > /dev/null 2>&1
2+
// RUN: llvm-tblgen -gen-intrinsic-impl -I %p/../../include %s -DTEST_INTRINSICS_SUPPRESS_DEFS | FileCheck %s --check-prefix=CHECK-IMPL
33
// 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
44

55
// XFAIL: vg_leak
66

77
include "llvm/IR/Intrinsics.td"
88

9-
// Make sure we can return up to 9 values.
10-
// CHECK-ENUM: returns_9_results = {{[0-9]+}}, // llvm.returns.9.results
11-
def int_returns_9_results : Intrinsic<
12-
!listsplat(llvm_anyint_ty, 9),
13-
[], [], "llvm.returns.9.results">;
9+
// Make sure we can return up to 257 values. Intrinsics are in alphabetical order.
10+
// CHECK-ENUM: returns_a0_results = {{[0-9]+}}, // llvm.returns.a0.results
11+
// CHECK-ENUM: returns_b1_results, // llvm.returns.b1.results
12+
// CHECK-ENUM: returns_c2_results, // llvm.returns.c2.results
13+
// CHECK-ENUM: returns_d9_results, // llvm.returns.d9.results
14+
// CHECK-ENUM: returns_e10_results, // llvm.returns.e10.results
15+
// CHECK-ENUM: returns_f257_results, // llvm.returns.f257.results
1416

15-
#ifdef ENABLE_ERROR
16-
// CHECK-ERROR: error: intrinsics can only return upto 9 values, 'int_returns_10_results' returns 10 values
17-
// CHECK-ERROR-NEXT: def int_returns_10_results : Intrinsic<
18-
def int_returns_10_results : Intrinsic<
17+
// Make sure the encoding table is correctly generated.
18+
// CHECK-IMPL: IIT_LongEncodingTable
19+
// CHECK-IMPL-NEXT: 21, 255
20+
// 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,
21+
// CHECK-IMPL-NEXT: 21, 0
22+
// CHECK-IMPL-SAME: 15, 1, 15, 9, 0
23+
// CHECK-IMPL-NEXT: 21, 7
24+
// CHECK-IMPL-SAME: 15, 1, 15, 9, 15, 17, 15, 25, 15, 33, 15, 41, 15, 49, 15, 57, 15, 65, 0
25+
// CHECK-IMPL-NEXT: 21, 8
26+
// CHECK-IMPL-SAME: 15, 1, 15, 9, 15, 17, 15, 25, 15, 33, 15, 41, 15, 49, 15, 57, 15, 65, 15, 73, 0
27+
def int_returns_a0_results : Intrinsic<
28+
[],
29+
[], [], "llvm.returns.a0.results">;
30+
31+
def int_returns_b1_results : Intrinsic<
32+
[llvm_anyint_ty],
33+
[], [], "llvm.returns.b1.results">;
34+
35+
def int_returns_c2_results : Intrinsic<
36+
!listsplat(llvm_anyint_ty, 2),
37+
[], [], "llvm.returns.c2.results">;
38+
39+
def int_returns_d9_results : Intrinsic<
40+
!listsplat(llvm_anyint_ty, 9),
41+
[], [], "llvm.returns.d9.results">;
42+
43+
def int_returns_e10_results : Intrinsic<
1944
!listsplat(llvm_anyint_ty, 10),
20-
[], [], "llvm.returns.10.results">;
45+
[], [], "llvm.returns.e10.results">;
46+
47+
def int_returns_f257_results : Intrinsic<
48+
!listsplat(llvm_anyint_ty, 257),
49+
[], [], "llvm.returns.f257.results">;
50+
51+
#ifdef ENABLE_ERROR
52+
// CHECK-ERROR: error: intrinsics can only return upto 257 values, 'int_returns_g258_results' returns 258 values
53+
// CHECK-ERROR-NEXT: def int_returns_g258_results : Intrinsic<
54+
def int_returns_g258_results : Intrinsic<
55+
!listsplat(llvm_anyint_ty, 258),
56+
[], [], "llvm.returns.g258.results">;
2157

2258
#endif

llvm/test/TableGen/intrinsic-varargs.td

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@
33

44
include "llvm/IR/Intrinsics.td"
55

6-
// CHECK: /* 0 */ 0, 29, 0,
6+
// CHECK: /* 0 */ 0, 26, 0,
77
def int_foo : Intrinsic<[], [llvm_vararg_ty]>;

llvm/utils/TableGen/Basic/CodeGenIntrinsics.cpp

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,13 @@
2121
#include <cassert>
2222
using namespace llvm;
2323

24+
// As the type of more than one return values is represented as an anonymous
25+
// struct, which is encoded with `IIT_STRUCT` followed by a byte specifying
26+
// the number of return values, starting from 2 (encoded as 0) to 257
27+
// (encoded as 255). So, the maximum number of values that an intrinsic can
28+
// return is 257.
29+
static constexpr unsigned MaxNumReturn = 257;
30+
2431
//===----------------------------------------------------------------------===//
2532
// CodeGenIntrinsic Implementation
2633
//===----------------------------------------------------------------------===//
@@ -29,15 +36,6 @@ CodeGenIntrinsicContext::CodeGenIntrinsicContext(const RecordKeeper &RC) {
2936
for (const Record *Rec : RC.getAllDerivedDefinitions("IntrinsicProperty"))
3037
if (Rec->getValueAsBit("IsDefault"))
3138
DefaultProperties.push_back(Rec);
32-
33-
// The maximum number of values that an intrinsic can return is the size of
34-
// of `IIT_RetNumbers` list - 1 (since we index into this list using the
35-
// number of return values as the index).
36-
const auto *IIT_RetNumbers =
37-
dyn_cast_or_null<ListInit>(RC.getGlobal("IIT_RetNumbers"));
38-
if (!IIT_RetNumbers)
39-
PrintFatalError("unable to find 'IIT_RetNumbers' list");
40-
MaxNumReturn = IIT_RetNumbers->size() - 1;
4139
}
4240

4341
CodeGenIntrinsicTable::CodeGenIntrinsicTable(const RecordKeeper &RC) {
@@ -302,11 +300,10 @@ CodeGenIntrinsic::CodeGenIntrinsic(const Record *R,
302300
}
303301

304302
unsigned NumRet = R->getValueAsListInit("RetTypes")->size();
305-
if (NumRet > Ctx.MaxNumReturn)
303+
if (NumRet > MaxNumReturn)
306304
PrintFatalError(DefLoc, "intrinsics can only return upto " +
307-
Twine(Ctx.MaxNumReturn) + " values, '" +
308-
DefName + "' returns " + Twine(NumRet) +
309-
" values");
305+
Twine(MaxNumReturn) + " values, '" + DefName +
306+
"' returns " + Twine(NumRet) + " values");
310307

311308
const Record *TypeInfo = R->getValueAsDef("TypeInfo");
312309
if (!TypeInfo->isSubClassOf("TypeInfoGen"))

llvm/utils/TableGen/Basic/CodeGenIntrinsics.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,6 @@ class RecordKeeper;
3030
struct CodeGenIntrinsicContext {
3131
explicit CodeGenIntrinsicContext(const RecordKeeper &RC);
3232
std::vector<const Record *> DefaultProperties;
33-
34-
// Maximum number of values an intrinsic can return.
35-
unsigned MaxNumReturn;
3633
};
3734

3835
struct CodeGenIntrinsic {

0 commit comments

Comments
 (0)