@@ -617,9 +617,7 @@ static AttributeSet getIntrinsicFnAttributeSet(LLVMContext &C, unsigned ID) {
617
617
}
618
618
OS << R"(
619
619
}
620
- } // getIntrinsicFnAttributeSet
621
-
622
- static constexpr uint16_t IntrinsicsToAttributesMap[] = {)" ;
620
+ } // getIntrinsicFnAttributeSet)" ;
623
621
624
622
// Compute unique argument attributes.
625
623
std::map<const CodeGenIntrinsic *, unsigned , AttributeComparator>
@@ -630,20 +628,29 @@ static constexpr uint16_t IntrinsicsToAttributesMap[] = {)";
630
628
}
631
629
632
630
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.
634
632
const uint8_t UniqFnAttributesBitSize =
635
633
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
643
648
// "argument attribute ID" (index in UniqAttributes) and upper bits will be
644
649
// its "function attribute ID" (index in UniqFnAttributes).
650
+ OS << formatv (" \n static constexpr uint{}_t IntrinsicsToAttributesMap[] = {{" ,
651
+ AttributesMapDataBitSize);
645
652
for (const CodeGenIntrinsic &Int : Ints) {
646
- uint16_t FnAttrIndex =
653
+ uint32_t FnAttrIndex =
647
654
hasFnAttributes (Int) ? UniqFnAttributes[&Int] : NoFunctionAttrsID;
648
655
OS << formatv (" \n {} << {} | {}, // {}" , FnAttrIndex,
649
656
UniqAttributesBitSize, UniqAttributes[&Int], Int.Name );
@@ -746,14 +753,19 @@ static constexpr ArgAttributesInfo ArgAttributesInfoTable[] = {{
746
753
// construct all the argument attributes (using the ArgAttributesInfoTable and
747
754
// ArgAttrIdTable) and then add on the function attributes if any.
748
755
OS << formatv (R"(
756
+
757
+ template <typename IDTy>
758
+ inline std::pair<uint32_t, uint32_t> unpackID(IDTy PackedID) {{
759
+ uint32_t FnAttrID = PackedID >> ({});
760
+ uint32_t ArgAttrID = PackedID & ({});
761
+ return {{FnAttrID, ArgAttrID};
762
+ }
763
+
749
764
AttributeList Intrinsic::getAttributes(LLVMContext &C, ID id,
750
765
FunctionType *FT) {{
751
766
if (id == 0)
752
767
return AttributeList();
753
-
754
- uint16_t PackedID = IntrinsicsToAttributesMap[id - 1];
755
- uint16_t FnAttrID = PackedID >> ({});
756
- uint16_t ArgAttrID = PackedID & ({});
768
+ auto [FnAttrID, ArgAttrID] = unpackID(IntrinsicsToAttributesMap[id - 1]);
757
769
using PairTy = std::pair<unsigned, AttributeSet>;
758
770
alignas(PairTy) char ASStorage[sizeof(PairTy) * {}];
759
771
PairTy *AS = reinterpret_cast<PairTy *>(ASStorage);
@@ -776,19 +788,18 @@ AttributeList Intrinsic::getAttributes(LLVMContext &C, ID id,
776
788
return AttributeList::get(C, ArrayRef(AS, NumAttrs));
777
789
}
778
790
779
- AttributeSet Intrinsic::getFnAttributes(LLVMContext &C, ID id) {
791
+ AttributeSet Intrinsic::getFnAttributes(LLVMContext &C, ID id) {{
780
792
if (id == 0)
781
793
return AttributeSet();
782
- uint16_t PackedID = IntrinsicsToAttributesMap[id - 1];
783
- uint16_t FnAttrID = PackedID >> ({});
794
+ auto [FnAttrID, ArgAttrID] = unpackID(IntrinsicsToAttributesMap[id - 1]);
784
795
return getIntrinsicFnAttributeSet(C, FnAttrID);
785
796
}
786
797
#endif // GET_INTRINSIC_ATTRIBUTES
787
798
788
799
)" ,
789
800
UniqAttributesBitSize,
790
- maskTrailingOnes<uint16_t >(UniqAttributesBitSize), MaxNumAttrs ,
791
- NoFunctionAttrsID, UniqAttributesBitSize );
801
+ maskTrailingOnes<uint32_t >(UniqAttributesBitSize),
802
+ MaxNumAttrs, NoFunctionAttrsID );
792
803
}
793
804
794
805
void IntrinsicEmitter::EmitIntrinsicToBuiltinMap (
0 commit comments