diff --git a/llvm/test/TableGen/intrinsic-attrs.td b/llvm/test/TableGen/intrinsic-attrs.td index ab808445f40a2..bdf987bbf7579 100644 --- a/llvm/test/TableGen/intrinsic-attrs.td +++ b/llvm/test/TableGen/intrinsic-attrs.td @@ -24,7 +24,7 @@ def int_deref_ptr_ret : Intrinsic<[llvm_ptr_ty], [], [Dereferenceable @@ -633,17 +631,25 @@ static constexpr uint16_t IntrinsicsToAttributesMap[] = {)"; // 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 + const uint32_t NoFunctionAttrsID = + maskTrailingOnes(UniqFnAttributesBitSize); + uint8_t AttributesMapDataBitSize = + PowerOf2Ceil(UniqAttributesBitSize + UniqFnAttributesBitSize); + if (AttributesMapDataBitSize < 8) + AttributesMapDataBitSize = 8; + else if (AttributesMapDataBitSize > 64) + PrintFatalError("Packed ID of IntrinsicsToAttributesMap exceeds 64b!"); + else if (AttributesMapDataBitSize > 16) + PrintWarning("Packed ID of IntrinsicsToAttributesMap exceeds 16b, " + "this may cause performance drop!"); + + // Assign a 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). + OS << formatv("\nstatic constexpr uint{}_t IntrinsicsToAttributesMap[] = {{", + AttributesMapDataBitSize); for (const CodeGenIntrinsic &Int : Ints) { - uint16_t FnAttrIndex = + uint32_t FnAttrIndex = hasFnAttributes(Int) ? UniqFnAttributes[&Int] : NoFunctionAttrsID; OS << formatv("\n {} << {} | {}, // {}", FnAttrIndex, UniqAttributesBitSize, UniqAttributes[&Int], Int.Name); @@ -751,9 +757,9 @@ AttributeList Intrinsic::getAttributes(LLVMContext &C, ID id, if (id == 0) return AttributeList(); - uint16_t PackedID = IntrinsicsToAttributesMap[id - 1]; - uint16_t FnAttrID = PackedID >> ({}); - uint16_t ArgAttrID = PackedID & ({}); + uint{}_t PackedID = IntrinsicsToAttributesMap[id - 1]; + uint32_t FnAttrID = PackedID >> ({}); + uint32_t ArgAttrID = PackedID & ({}); using PairTy = std::pair; alignas(PairTy) char ASStorage[sizeof(PairTy) * {}]; PairTy *AS = reinterpret_cast(ASStorage); @@ -779,16 +785,17 @@ AttributeList Intrinsic::getAttributes(LLVMContext &C, ID id, AttributeSet Intrinsic::getFnAttributes(LLVMContext &C, ID id) { if (id == 0) return AttributeSet(); - uint16_t PackedID = IntrinsicsToAttributesMap[id - 1]; - uint16_t FnAttrID = PackedID >> ({}); + uint{}_t PackedID = IntrinsicsToAttributesMap[id - 1]; + uint32_t FnAttrID = PackedID >> ({}); return getIntrinsicFnAttributeSet(C, FnAttrID); } #endif // GET_INTRINSIC_ATTRIBUTES )", - UniqAttributesBitSize, + AttributesMapDataBitSize, UniqAttributesBitSize, maskTrailingOnes(UniqAttributesBitSize), MaxNumAttrs, - NoFunctionAttrsID, UniqAttributesBitSize); + NoFunctionAttrsID, AttributesMapDataBitSize, + UniqAttributesBitSize); } void IntrinsicEmitter::EmitIntrinsicToBuiltinMap(