diff --git a/llvm/include/llvm/IR/Intrinsics.td b/llvm/include/llvm/IR/Intrinsics.td --- a/llvm/include/llvm/IR/Intrinsics.td +++ b/llvm/include/llvm/IR/Intrinsics.td @@ -182,6 +182,92 @@ int MatchType = 7; } +//===----------------------------------------------------------------------===// +// IIT_Info +//===----------------------------------------------------------------------===// + +class IIT_Base { + int Number = num; + list VTs = ?; +} + +class IIT_VT : IIT_Base { + let VTs = [vt]; +} + +class IIT_Int : IIT_Base { + let VTs = !filter(vti, ValueTypes, + !and(vti.isInteger, !eq(vti.Size, size))); +} + +class IIT_Vec : IIT_Base { + let VTs = !filter(vti, ValueTypes, + !and(vti.isVector, !eq(vti.nElem, nelem))); +} + +defset list IIT_all = { +def IIT_Done : IIT_Base< 0>; +def IIT_I1 : IIT_Int<1, 1>; +def IIT_I8 : IIT_Int<8, 2>; +def IIT_I16 : IIT_Int<16, 3>; +def IIT_I32 : IIT_Int<32, 4>; +def IIT_I64 : IIT_Int<64, 5>; +def IIT_F16 : IIT_VT; +def IIT_F32 : IIT_VT; +def IIT_F64 : IIT_VT; +def IIT_V2 : IIT_Vec<2, 9>; +def IIT_V4 : IIT_Vec<4, 10>; +def IIT_V8 : IIT_Vec<8, 11>; +def IIT_V16 : IIT_Vec<16, 12>; +def IIT_V32 : IIT_Vec<32, 13>; +def IIT_PTR : IIT_Base< 14>; +def IIT_ARG : IIT_Base< 15>; + +def IIT_V64 : IIT_Vec<64, 16>; +def IIT_MMX : IIT_VT; +def IIT_TOKEN : IIT_VT; +def IIT_METADATA : IIT_VT; +def IIT_EMPTYSTRUCT : IIT_VT; +def IIT_STRUCT2 : IIT_Base<21>; +def IIT_STRUCT3 : IIT_Base<22>; +def IIT_STRUCT4 : IIT_Base<23>; +def IIT_STRUCT5 : IIT_Base<24>; +def IIT_EXTEND_ARG : IIT_Base<25>; +def IIT_TRUNC_ARG : IIT_Base<26>; +def IIT_ANYPTR : IIT_Base<27>; +def IIT_V1 : IIT_Vec<1, 28>; +def IIT_VARARG : IIT_VT; +def IIT_HALF_VEC_ARG : IIT_Base<30>; +def IIT_SAME_VEC_WIDTH_ARG : IIT_Base<31>; +def IIT_PTR_TO_ARG : IIT_Base<32>; +def IIT_PTR_TO_ELT : IIT_Base<33>; +def IIT_VEC_OF_ANYPTRS_TO_ELT : IIT_Base<34>; +def IIT_I128 : IIT_Int<128, 35>; +def IIT_V512 : IIT_Vec<512, 36>; +def IIT_V1024 : IIT_Vec<1024, 37>; +def IIT_STRUCT6 : IIT_Base<38>; +def IIT_STRUCT7 : IIT_Base<39>; +def IIT_STRUCT8 : IIT_Base<40>; +def IIT_F128 : IIT_VT; +def IIT_VEC_ELEMENT : IIT_Base<42>; +def IIT_SCALABLE_VEC : IIT_Base<43>; +def IIT_SUBDIVIDE2_ARG : IIT_Base<44>; +def IIT_SUBDIVIDE4_ARG : IIT_Base<45>; +def IIT_VEC_OF_BITCASTS_TO_INT : IIT_Base<46>; +def IIT_V128 : IIT_Vec<128, 47>; +def IIT_BF16 : IIT_VT; +def IIT_STRUCT9 : IIT_Base<49>; +def IIT_V256 : IIT_Vec<256, 50>; +def IIT_AMX : IIT_VT; +def IIT_PPCF128 : IIT_VT; +def IIT_V3 : IIT_Vec<3, 53>; +def IIT_EXTERNREF : IIT_VT; +def IIT_FUNCREF : IIT_VT; +def IIT_ANYPTR_TO_ELT : IIT_Base<56>; +def IIT_I2 : IIT_Int<2, 57>; +def IIT_I4 : IIT_Int<4, 58>; +} + //===----------------------------------------------------------------------===// // Types used by intrinsics. //===----------------------------------------------------------------------===// diff --git a/llvm/lib/IR/Function.cpp b/llvm/lib/IR/Function.cpp --- a/llvm/lib/IR/Function.cpp +++ b/llvm/lib/IR/Function.cpp @@ -1023,70 +1023,11 @@ /// IIT_Info - These are enumerators that describe the entries returned by the /// getIntrinsicInfoTableEntries function. /// -/// NOTE: This must be kept in synch with the copy in TblGen/IntrinsicEmitter! +/// Defined in Intrinsics.td. enum IIT_Info { - // Common values should be encoded with 0-15. - IIT_Done = 0, - IIT_I1 = 1, - IIT_I8 = 2, - IIT_I16 = 3, - IIT_I32 = 4, - IIT_I64 = 5, - IIT_F16 = 6, - IIT_F32 = 7, - IIT_F64 = 8, - IIT_V2 = 9, - IIT_V4 = 10, - IIT_V8 = 11, - IIT_V16 = 12, - IIT_V32 = 13, - IIT_PTR = 14, - IIT_ARG = 15, - - // Values from 16+ are only encodable with the inefficient encoding. - IIT_V64 = 16, - IIT_MMX = 17, - IIT_TOKEN = 18, - IIT_METADATA = 19, - IIT_EMPTYSTRUCT = 20, - IIT_STRUCT2 = 21, - IIT_STRUCT3 = 22, - IIT_STRUCT4 = 23, - IIT_STRUCT5 = 24, - IIT_EXTEND_ARG = 25, - IIT_TRUNC_ARG = 26, - IIT_ANYPTR = 27, - IIT_V1 = 28, - IIT_VARARG = 29, - IIT_HALF_VEC_ARG = 30, - IIT_SAME_VEC_WIDTH_ARG = 31, - IIT_PTR_TO_ARG = 32, - IIT_PTR_TO_ELT = 33, - IIT_VEC_OF_ANYPTRS_TO_ELT = 34, - IIT_I128 = 35, - IIT_V512 = 36, - IIT_V1024 = 37, - IIT_STRUCT6 = 38, - IIT_STRUCT7 = 39, - IIT_STRUCT8 = 40, - IIT_F128 = 41, - IIT_VEC_ELEMENT = 42, - IIT_SCALABLE_VEC = 43, - IIT_SUBDIVIDE2_ARG = 44, - IIT_SUBDIVIDE4_ARG = 45, - IIT_VEC_OF_BITCASTS_TO_INT = 46, - IIT_V128 = 47, - IIT_BF16 = 48, - IIT_STRUCT9 = 49, - IIT_V256 = 50, - IIT_AMX = 51, - IIT_PPCF128 = 52, - IIT_V3 = 53, - IIT_EXTERNREF = 54, - IIT_FUNCREF = 55, - IIT_ANYPTR_TO_ELT = 56, - IIT_I2 = 57, - IIT_I4 = 58, +#define GET_INTRINSIC_IITINFO +#include "llvm/IR/IntrinsicImpl.inc" +#undef GET_INTRINSIC_IITINFO }; static void DecodeIITType(unsigned &NextElt, ArrayRef Infos, diff --git a/llvm/utils/TableGen/IntrinsicEmitter.cpp b/llvm/utils/TableGen/IntrinsicEmitter.cpp --- a/llvm/utils/TableGen/IntrinsicEmitter.cpp +++ b/llvm/utils/TableGen/IntrinsicEmitter.cpp @@ -28,6 +28,7 @@ #include "llvm/TableGen/StringToOffsetTable.h" #include "llvm/TableGen/TableGenBackend.h" #include +#include #include #include #include @@ -54,6 +55,7 @@ void EmitEnumInfo(const CodeGenIntrinsicTable &Ints, raw_ostream &OS); void EmitArgKind(raw_ostream &OS); + void EmitIITInfo(raw_ostream &OS); void EmitTargetInfo(const CodeGenIntrinsicTable &Ints, raw_ostream &OS); void EmitIntrinsicToNameTable(const CodeGenIntrinsicTable &Ints, raw_ostream &OS); @@ -82,6 +84,9 @@ // Emit ArgKind for Intrinsics.h. EmitArgKind(OS); } else { + // Emit IIT_Info constants. + EmitIITInfo(OS); + // Emit the target metadata. EmitTargetInfo(Ints, OS); @@ -180,6 +185,27 @@ OS << "#endif\n\n"; } +void IntrinsicEmitter::EmitIITInfo(raw_ostream &OS) { + OS << "#ifdef GET_INTRINSIC_IITINFO\n"; + std::array RecsByNumber; + auto IIT_Base = Records.getAllDerivedDefinitionsIfDefined("IIT_Base"); + for (auto Rec : IIT_Base) { + auto Number = Rec->getValueAsInt("Number"); + assert(0 <= Number && Number < (int)RecsByNumber.size() && + "IIT_Info.Number should be uint8_t"); + assert(RecsByNumber[Number].empty() && "Duplicate IIT_Info.Number"); + RecsByNumber[Number] = Rec->getName(); + } + if (IIT_Base.size() > 0) { + for (unsigned I = 0, E = RecsByNumber.size(); I < E; ++I) + if (!RecsByNumber[I].empty()) + OS << " " << RecsByNumber[I] << " = " << I << ",\n"; + } else { + OS << "#error \"class IIT_Base is not defined\"\n"; + } + OS << "#endif\n\n"; +} + void IntrinsicEmitter::EmitTargetInfo(const CodeGenIntrinsicTable &Ints, raw_ostream &OS) { OS << "// Target mapping\n";