Skip to content

Commit

Permalink
[IR] Optimize adding attribute to AttributeList (NFC)
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
nikic committed Jan 22, 2021
1 parent 5097413 commit 176c7f2
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 12 deletions.
3 changes: 3 additions & 0 deletions llvm/include/llvm/IR/Attributes.h
Original file line number Diff line number Diff line change
Expand Up @@ -399,6 +399,9 @@ class AttributeList {

static AttributeList getImpl(LLVMContext &C, ArrayRef<AttributeSet> AttrSets);

AttributeList setAttributes(LLVMContext &C, unsigned Index,
AttributeSet Attrs) const;

public:
AttributeList() = default;

Expand Down
29 changes: 17 additions & 12 deletions llvm/lib/IR/Attributes.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1272,9 +1272,11 @@ AttributeList AttributeList::get(LLVMContext &C,
AttributeList AttributeList::addAttribute(LLVMContext &C, unsigned Index,
Attribute::AttrKind Kind) const {
if (hasAttribute(Index, Kind)) return *this;
AttrBuilder B;
B.addAttribute(Kind);
return addAttributes(C, Index, B);
AttributeSet Attrs = getAttributes(Index);
// TODO: Insert at correct position and avoid sort.
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,
Expand All @@ -1292,6 +1294,16 @@ AttributeList AttributeList::addAttribute(LLVMContext &C, unsigned Index,
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,
const AttrBuilder &B) const {
if (!B.hasAttributes())
Expand All @@ -1309,16 +1321,9 @@ AttributeList AttributeList::addAttributes(LLVMContext &C, unsigned Index,
"Attempt to change alignment!");
#endif

Index = attrIdxToArrayIdx(Index);
SmallVector<AttributeSet, 4> AttrSets(this->begin(), this->end());
if (Index >= AttrSets.size())
AttrSets.resize(Index + 1);

AttrBuilder Merged(AttrSets[Index]);
AttrBuilder Merged(getAttributes(Index));
Merged.merge(B);
AttrSets[Index] = AttributeSet::get(C, Merged);

return getImpl(C, AttrSets);
return setAttributes(C, Index, AttributeSet::get(C, Merged));
}

AttributeList AttributeList::addParamAttribute(LLVMContext &C,
Expand Down

0 comments on commit 176c7f2

Please sign in to comment.