1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-25 12:12:47 +01:00

[IR] Optimize adding attribute to AttributeList (NFC)

When adding an enum attribute to an AttributeList, avoid going
through an AttrBuilder and instead directly add the attribute to
the correct set. Going through AttrBuilder is expensive, because
it requires all string attributes to be reconstructed.

This can be further improved by inserting the attribute at the
right position and using the AttributeSetNode::getSorted() API.

This recovers the small compile-time regression from D94633.
This commit is contained in:
Nikita Popov 2021-01-22 10:38:36 +01:00
parent 17857e2d95
commit 8c54b2d6f0
2 changed files with 20 additions and 12 deletions

View File

@ -399,6 +399,9 @@ private:
static AttributeList getImpl(LLVMContext &C, ArrayRef<AttributeSet> AttrSets); static AttributeList getImpl(LLVMContext &C, ArrayRef<AttributeSet> AttrSets);
AttributeList setAttributes(LLVMContext &C, unsigned Index,
AttributeSet Attrs) const;
public: public:
AttributeList() = default; AttributeList() = default;

View File

@ -1272,9 +1272,11 @@ AttributeList AttributeList::get(LLVMContext &C,
AttributeList AttributeList::addAttribute(LLVMContext &C, unsigned Index, AttributeList AttributeList::addAttribute(LLVMContext &C, unsigned Index,
Attribute::AttrKind Kind) const { Attribute::AttrKind Kind) const {
if (hasAttribute(Index, Kind)) return *this; if (hasAttribute(Index, Kind)) return *this;
AttrBuilder B; AttributeSet Attrs = getAttributes(Index);
B.addAttribute(Kind); // TODO: Insert at correct position and avoid sort.
return addAttributes(C, Index, B); SmallVector<Attribute, 8> NewAttrs(Attrs.begin(), Attrs.end());
NewAttrs.push_back(Attribute::get(C, Kind));
return setAttributes(C, Index, AttributeSet::get(C, NewAttrs));
} }
AttributeList AttributeList::addAttribute(LLVMContext &C, unsigned Index, AttributeList AttributeList::addAttribute(LLVMContext &C, unsigned Index,
@ -1292,6 +1294,16 @@ AttributeList AttributeList::addAttribute(LLVMContext &C, unsigned Index,
return addAttributes(C, Index, B); return addAttributes(C, Index, B);
} }
AttributeList AttributeList::setAttributes(LLVMContext &C, unsigned Index,
AttributeSet Attrs) const {
Index = attrIdxToArrayIdx(Index);
SmallVector<AttributeSet, 4> AttrSets(this->begin(), this->end());
if (Index >= AttrSets.size())
AttrSets.resize(Index + 1);
AttrSets[Index] = Attrs;
return AttributeList::getImpl(C, AttrSets);
}
AttributeList AttributeList::addAttributes(LLVMContext &C, unsigned Index, AttributeList AttributeList::addAttributes(LLVMContext &C, unsigned Index,
const AttrBuilder &B) const { const AttrBuilder &B) const {
if (!B.hasAttributes()) if (!B.hasAttributes())
@ -1309,16 +1321,9 @@ AttributeList AttributeList::addAttributes(LLVMContext &C, unsigned Index,
"Attempt to change alignment!"); "Attempt to change alignment!");
#endif #endif
Index = attrIdxToArrayIdx(Index); AttrBuilder Merged(getAttributes(Index));
SmallVector<AttributeSet, 4> AttrSets(this->begin(), this->end());
if (Index >= AttrSets.size())
AttrSets.resize(Index + 1);
AttrBuilder Merged(AttrSets[Index]);
Merged.merge(B); Merged.merge(B);
AttrSets[Index] = AttributeSet::get(C, Merged); return setAttributes(C, Index, AttributeSet::get(C, Merged));
return getImpl(C, AttrSets);
} }
AttributeList AttributeList::addParamAttribute(LLVMContext &C, AttributeList AttributeList::addParamAttribute(LLVMContext &C,