@@ -629,21 +629,24 @@ static constexpr uint16_t IntrinsicsToAttributesMap[] = {)";
629
629
UniqAttributes.try_emplace (&Int, ID);
630
630
}
631
631
632
- constexpr uint16_t NoFunctionAttrsID = 255 ;
633
- if (UniqAttributes.size () > 256 )
634
- PrintFatalError (" Too many unique argument attributes for table!" );
635
- // Note, ID 255 is used to indicate no function attributes.
636
- if (UniqFnAttributes.size () > 255 )
637
- PrintFatalError (" Too many unique function attributes for table!" );
638
-
639
- // Assign a 16-bit packed ID for each intrinsic. The lower 8-bits will be its
640
- // "argument attribute ID" (index in UniqAttributes) and upper 8 bits will be
632
+ const uint8_t UniqAttributesBitSize = Log2_32_Ceil (UniqAttributes.size () + 1 );
633
+ // Note, ID `-1` is used to indicate no function attributes.
634
+ const uint8_t UniqFnAttributesBitSize =
635
+ Log2_32_Ceil (UniqFnAttributes.size () + 2 );
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
643
+ // "argument attribute ID" (index in UniqAttributes) and upper bits will be
641
644
// its "function attribute ID" (index in UniqFnAttributes).
642
645
for (const CodeGenIntrinsic &Int : Ints) {
643
646
uint16_t FnAttrIndex =
644
647
hasFnAttributes (Int) ? UniqFnAttributes[&Int] : NoFunctionAttrsID;
645
- OS << formatv (" \n {} << 8 | {}, // {}" , FnAttrIndex,
646
- UniqAttributes[&Int], Int.Name );
648
+ OS << formatv (" \n {} << {} | {}, // {}" , FnAttrIndex,
649
+ UniqAttributesBitSize, UniqAttributes[&Int], Int.Name );
647
650
}
648
651
649
652
OS << R"(
@@ -749,8 +752,8 @@ AttributeList Intrinsic::getAttributes(LLVMContext &C, ID id,
749
752
return AttributeList();
750
753
751
754
uint16_t PackedID = IntrinsicsToAttributesMap[id - 1];
752
- uint8_t FnAttrID = PackedID >> 8 ;
753
- uint8_t ArgAttrID = PackedID & 0xFF ;
755
+ uint16_t FnAttrID = PackedID >> ({}) ;
756
+ uint16_t ArgAttrID = PackedID & ({}) ;
754
757
using PairTy = std::pair<unsigned, AttributeSet>;
755
758
alignas(PairTy) char ASStorage[sizeof(PairTy) * {}];
756
759
PairTy *AS = reinterpret_cast<PairTy *>(ASStorage);
@@ -772,10 +775,20 @@ AttributeList Intrinsic::getAttributes(LLVMContext &C, ID id,
772
775
}
773
776
return AttributeList::get(C, ArrayRef(AS, NumAttrs));
774
777
}
778
+
779
+ AttributeSet Intrinsic::getFnAttributes(LLVMContext &C, ID id) {
780
+ if (id == 0)
781
+ return AttributeSet();
782
+ uint16_t PackedID = IntrinsicsToAttributesMap[id - 1];
783
+ uint16_t FnAttrID = PackedID >> ({});
784
+ return getIntrinsicFnAttributeSet(C, FnAttrID);
785
+ }
775
786
#endif // GET_INTRINSIC_ATTRIBUTES
776
787
777
788
)" ,
778
- MaxNumAttrs, NoFunctionAttrsID);
789
+ UniqAttributesBitSize,
790
+ maskTrailingOnes<uint16_t >(UniqAttributesBitSize), MaxNumAttrs,
791
+ NoFunctionAttrsID, UniqAttributesBitSize);
779
792
}
780
793
781
794
void IntrinsicEmitter::EmitIntrinsicToBuiltinMap (
0 commit comments