@@ -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>
@@ -633,17 +631,26 @@ static constexpr uint16_t IntrinsicsToAttributesMap[] = {)";
633
631
// Note, ID `-1` is used to indicate no function attributes.
634
632
const uint8_t UniqFnAttributesBitSize =
635
633
Log2_32_Ceil (UniqFnAttributes.size () + 2 );
636
- const uint16_t NoFunctionAttrsID =
637
- maskTrailingOnes<uint16_t >(UniqFnAttributesBitSize);
638
- if (UniqAttributesBitSize + UniqFnAttributesBitSize > 16 )
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 )
639
641
PrintFatalError (
640
- " More than 16 bits are used for IntrinsicsToAttributesMap's entry!" );
642
+ " Packed ID of IntrinsicsToAttributesMap exceeds 64b!" );
643
+ else if (AttributesMapDataBitSize > 16 )
644
+ PrintWarning (" Packed ID of IntrinsicsToAttributesMap exceeds 16b, "
645
+ " this may cause performance drop!" );
641
646
642
- // Assign a 16-bit packed ID for each intrinsic. The lower bits will be its
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 );
@@ -751,9 +758,9 @@ AttributeList Intrinsic::getAttributes(LLVMContext &C, ID id,
751
758
if (id == 0)
752
759
return AttributeList();
753
760
754
- uint16_t PackedID = IntrinsicsToAttributesMap[id - 1];
755
- uint16_t FnAttrID = PackedID >> ({});
756
- uint16_t ArgAttrID = PackedID & ({});
761
+ uint{}_t PackedID = IntrinsicsToAttributesMap[id - 1];
762
+ uint32_t FnAttrID = PackedID >> ({});
763
+ uint32_t ArgAttrID = PackedID & ({});
757
764
using PairTy = std::pair<unsigned, AttributeSet>;
758
765
alignas(PairTy) char ASStorage[sizeof(PairTy) * {}];
759
766
PairTy *AS = reinterpret_cast<PairTy *>(ASStorage);
@@ -779,16 +786,17 @@ AttributeList Intrinsic::getAttributes(LLVMContext &C, ID id,
779
786
AttributeSet Intrinsic::getFnAttributes(LLVMContext &C, ID id) {
780
787
if (id == 0)
781
788
return AttributeSet();
782
- uint16_t PackedID = IntrinsicsToAttributesMap[id - 1];
783
- uint16_t FnAttrID = PackedID >> ({});
789
+ uint{}_t PackedID = IntrinsicsToAttributesMap[id - 1];
790
+ uint32_t FnAttrID = PackedID >> ({});
784
791
return getIntrinsicFnAttributeSet(C, FnAttrID);
785
792
}
786
793
#endif // GET_INTRINSIC_ATTRIBUTES
787
794
788
795
)" ,
789
- UniqAttributesBitSize,
796
+ AttributesMapDataBitSize, UniqAttributesBitSize,
790
797
maskTrailingOnes<uint16_t >(UniqAttributesBitSize), MaxNumAttrs,
791
- NoFunctionAttrsID, UniqAttributesBitSize);
798
+ NoFunctionAttrsID,
799
+ AttributesMapDataBitSize, UniqAttributesBitSize);
792
800
}
793
801
794
802
void IntrinsicEmitter::EmitIntrinsicToBuiltinMap (
0 commit comments