diff --git a/llvm/lib/IR/Intrinsics.cpp b/llvm/lib/IR/Intrinsics.cpp index 58a1f745a7122..4d2e8fadff4f7 100644 --- a/llvm/lib/IR/Intrinsics.cpp +++ b/llvm/lib/IR/Intrinsics.cpp @@ -740,14 +740,6 @@ Intrinsic::ID Intrinsic::lookupIntrinsicID(StringRef Name) { #include "llvm/IR/IntrinsicImpl.inc" #undef GET_INTRINSIC_ATTRIBUTES -AttributeSet Intrinsic::getFnAttributes(LLVMContext &C, ID id) { - if (id == 0) - return AttributeSet(); - uint16_t PackedID = IntrinsicsToAttributesMap[id - 1]; - uint8_t FnAttrID = PackedID >> 8; - return getIntrinsicFnAttributeSet(C, FnAttrID); -} - Function *Intrinsic::getOrInsertDeclaration(Module *M, ID id, ArrayRef Tys) { // There can never be multiple globals with the same name of different types, diff --git a/llvm/test/TableGen/intrinsic-attrs.td b/llvm/test/TableGen/intrinsic-attrs.td index bcded0cd2e9f1..ab808445f40a2 100644 --- a/llvm/test/TableGen/intrinsic-attrs.td +++ b/llvm/test/TableGen/intrinsic-attrs.td @@ -25,8 +25,8 @@ def int_deref_ptr_ret : Intrinsic<[llvm_ptr_ty], [], [Dereferenceable 256) - PrintFatalError("Too many unique argument attributes for table!"); - // Note, ID 255 is used to indicate no function attributes. - if (UniqFnAttributes.size() > 255) - PrintFatalError("Too many unique function attributes for table!"); - - // Assign a 16-bit packed ID for each intrinsic. The lower 8-bits will be its - // "argument attribute ID" (index in UniqAttributes) and upper 8 bits will be + const uint8_t UniqAttributesBitSize = Log2_32_Ceil(UniqAttributes.size() + 1); + // Note, ID `-1` is used to indicate no function attributes. + const uint8_t UniqFnAttributesBitSize = + Log2_32_Ceil(UniqFnAttributes.size() + 2); + const uint16_t NoFunctionAttrsID = + maskTrailingOnes(UniqFnAttributesBitSize); + if (UniqAttributesBitSize + UniqFnAttributesBitSize > 16) + PrintFatalError( + "More than 16 bits are used for IntrinsicsToAttributesMap's entry!"); + + // Assign a 16-bit packed ID for each intrinsic. The lower bits will be its + // "argument attribute ID" (index in UniqAttributes) and upper bits will be // its "function attribute ID" (index in UniqFnAttributes). for (const CodeGenIntrinsic &Int : Ints) { uint16_t FnAttrIndex = hasFnAttributes(Int) ? UniqFnAttributes[&Int] : NoFunctionAttrsID; - OS << formatv("\n {} << 8 | {}, // {}", FnAttrIndex, - UniqAttributes[&Int], Int.Name); + OS << formatv("\n {} << {} | {}, // {}", FnAttrIndex, + UniqAttributesBitSize, UniqAttributes[&Int], Int.Name); } OS << R"( @@ -749,8 +752,8 @@ AttributeList Intrinsic::getAttributes(LLVMContext &C, ID id, return AttributeList(); uint16_t PackedID = IntrinsicsToAttributesMap[id - 1]; - uint8_t FnAttrID = PackedID >> 8; - uint8_t ArgAttrID = PackedID & 0xFF; + uint16_t FnAttrID = PackedID >> ({}); + uint16_t ArgAttrID = PackedID & ({}); using PairTy = std::pair; alignas(PairTy) char ASStorage[sizeof(PairTy) * {}]; PairTy *AS = reinterpret_cast(ASStorage); @@ -772,10 +775,20 @@ AttributeList Intrinsic::getAttributes(LLVMContext &C, ID id, } return AttributeList::get(C, ArrayRef(AS, NumAttrs)); } + +AttributeSet Intrinsic::getFnAttributes(LLVMContext &C, ID id) { + if (id == 0) + return AttributeSet(); + uint16_t PackedID = IntrinsicsToAttributesMap[id - 1]; + uint16_t FnAttrID = PackedID >> ({}); + return getIntrinsicFnAttributeSet(C, FnAttrID); +} #endif // GET_INTRINSIC_ATTRIBUTES )", - MaxNumAttrs, NoFunctionAttrsID); + UniqAttributesBitSize, + maskTrailingOnes(UniqAttributesBitSize), MaxNumAttrs, + NoFunctionAttrsID, UniqAttributesBitSize); } void IntrinsicEmitter::EmitIntrinsicToBuiltinMap(