@@ -617,9 +617,7 @@ static AttributeSet getIntrinsicFnAttributeSet(LLVMContext &C, unsigned ID) {
617617 }
618618 OS << R"(
619619 }
620- } // getIntrinsicFnAttributeSet
621-
622- static constexpr uint16_t IntrinsicsToAttributesMap[] = {)" ;
620+ } // getIntrinsicFnAttributeSet)" ;
623621
624622 // Compute unique argument attributes.
625623 std::map<const CodeGenIntrinsic *, unsigned , AttributeComparator>
@@ -630,20 +628,29 @@ static constexpr uint16_t IntrinsicsToAttributesMap[] = {)";
630628 }
631629
632630 const uint8_t UniqAttributesBitSize = Log2_32_Ceil (UniqAttributes.size ());
633- // Note, ID `-1` is used to indicate no function attributes.
631+ // Note, max value is used to indicate no function attributes.
634632 const uint8_t UniqFnAttributesBitSize =
635633 Log2_32_Ceil (UniqFnAttributes.size () + 1 );
636- const uint16_t NoFunctionAttrsID =
637- maskTrailingOnes<uint16_t >(UniqFnAttributesBitSize);
638- if (UniqAttributesBitSize + UniqFnAttributesBitSize > 16 )
639- PrintFatalError (
640- " More than 16 bits are used for IntrinsicsToAttributesMap's entry!" );
641-
642- // Assign a 16-bit packed ID for each intrinsic. The lower bits will be its
634+ const uint32_t NoFunctionAttrsID =
635+ maskTrailingOnes<uint32_t >(UniqFnAttributesBitSize);
636+ uint8_t AttributesMapDataBitSize =
637+ PowerOf2Ceil (UniqAttributesBitSize + UniqFnAttributesBitSize);
638+ if (AttributesMapDataBitSize < 8 )
639+ AttributesMapDataBitSize = 8 ;
640+ else if (AttributesMapDataBitSize > 64 )
641+ PrintFatalError (" Packed ID of IntrinsicsToAttributesMap exceeds 64b!" );
642+ else if (AttributesMapDataBitSize > 16 )
643+ PrintWarning (" Packed ID of IntrinsicsToAttributesMap exceeds 16b, "
644+ " this may cause performance drop (pr106809), "
645+ " please consider redesigning intrinsic sets!" );
646+
647+ // Assign a packed ID for each intrinsic. The lower bits will be its
643648 // "argument attribute ID" (index in UniqAttributes) and upper bits will be
644649 // its "function attribute ID" (index in UniqFnAttributes).
650+ OS << formatv (" \n static constexpr uint{}_t IntrinsicsToAttributesMap[] = {{" ,
651+ AttributesMapDataBitSize);
645652 for (const CodeGenIntrinsic &Int : Ints) {
646- uint16_t FnAttrIndex =
653+ uint32_t FnAttrIndex =
647654 hasFnAttributes (Int) ? UniqFnAttributes[&Int] : NoFunctionAttrsID;
648655 OS << formatv (" \n {} << {} | {}, // {}" , FnAttrIndex,
649656 UniqAttributesBitSize, UniqAttributes[&Int], Int.Name );
@@ -746,14 +753,21 @@ static constexpr ArgAttributesInfo ArgAttributesInfoTable[] = {{
746753 // construct all the argument attributes (using the ArgAttributesInfoTable and
747754 // ArgAttrIdTable) and then add on the function attributes if any.
748755 OS << formatv (R"(
756+
757+ template <typename IDTy>
758+ inline std::pair<uint32_t, uint32_t> unpackID(const IDTy PackedID) {{
759+ constexpr uint8_t UniqAttributesBitSize = {};
760+ const uint32_t FnAttrID = PackedID >> UniqAttributesBitSize;
761+ const uint32_t ArgAttrID = PackedID &
762+ maskTrailingOnes<uint32_t>(UniqAttributesBitSize);
763+ return {{FnAttrID, ArgAttrID};
764+ }
765+
749766AttributeList Intrinsic::getAttributes(LLVMContext &C, ID id,
750767 FunctionType *FT) {{
751768 if (id == 0)
752769 return AttributeList();
753-
754- uint16_t PackedID = IntrinsicsToAttributesMap[id - 1];
755- uint16_t FnAttrID = PackedID >> ({});
756- uint16_t ArgAttrID = PackedID & ({});
770+ auto [FnAttrID, ArgAttrID] = unpackID(IntrinsicsToAttributesMap[id - 1]);
757771 using PairTy = std::pair<unsigned, AttributeSet>;
758772 alignas(PairTy) char ASStorage[sizeof(PairTy) * {}];
759773 PairTy *AS = reinterpret_cast<PairTy *>(ASStorage);
@@ -776,19 +790,16 @@ AttributeList Intrinsic::getAttributes(LLVMContext &C, ID id,
776790 return AttributeList::get(C, ArrayRef(AS, NumAttrs));
777791}
778792
779- AttributeSet Intrinsic::getFnAttributes(LLVMContext &C, ID id) {
793+ AttributeSet Intrinsic::getFnAttributes(LLVMContext &C, ID id) {{
780794 if (id == 0)
781795 return AttributeSet();
782- uint16_t PackedID = IntrinsicsToAttributesMap[id - 1];
783- uint16_t FnAttrID = PackedID >> ({});
796+ auto [FnAttrID, _] = unpackID(IntrinsicsToAttributesMap[id - 1]);
784797 return getIntrinsicFnAttributeSet(C, FnAttrID);
785798}
786799#endif // GET_INTRINSIC_ATTRIBUTES
787800
788801)" ,
789- UniqAttributesBitSize,
790- maskTrailingOnes<uint16_t >(UniqAttributesBitSize), MaxNumAttrs,
791- NoFunctionAttrsID, UniqAttributesBitSize);
802+ UniqAttributesBitSize, MaxNumAttrs, NoFunctionAttrsID);
792803}
793804
794805void IntrinsicEmitter::EmitIntrinsicToBuiltinMap (
0 commit comments