AttributeSetNode: Summarize existing attributes in a bitset.

The majority of queries just checks for the existince of an enum
attribute.  We only have 48 of those and can summaryiz them in an
uint64_t bitfield so we can avoid searching the list. This improves
"opt" compile time by 1-4% in my measurements.

Differential Revision: http://reviews.llvm.org/D16617

llvm-svn: 259251
This commit is contained in:
Matthias Braun 2016-01-29 22:25:13 +00:00
parent 5e378ddc1e
commit 31eeb76f5e
2 changed files with 20 additions and 12 deletions

View File

@ -148,10 +148,21 @@ class AttributeSetNode final
friend TrailingObjects;
unsigned NumAttrs; ///< Number of attributes in this node.
/// Bitset with a bit for each available attribute Attribute::AttrKind.
uint64_t AvailableAttrs;
static_assert(Attribute::EndAttrKinds <= sizeof(AvailableAttrs)*CHAR_BIT,
"Too many attributes for AvailableAttrs");
AttributeSetNode(ArrayRef<Attribute> Attrs) : NumAttrs(Attrs.size()) {
AttributeSetNode(ArrayRef<Attribute> Attrs)
: NumAttrs(Attrs.size()), AvailableAttrs(0) {
// There's memory after the node where we can store the entries in.
std::copy(Attrs.begin(), Attrs.end(), getTrailingObjects<Attribute>());
for (iterator I = begin(), E = end(); I != E; ++I) {
if (!I->isStringAttribute()) {
AvailableAttrs |= ((uint64_t)1) << I->getKindAsEnum();
}
}
}
// AttributesSetNode is uniqued, these should not be publicly available.
@ -160,7 +171,9 @@ class AttributeSetNode final
public:
static AttributeSetNode *get(LLVMContext &C, ArrayRef<Attribute> Attrs);
bool hasAttribute(Attribute::AttrKind Kind) const;
bool hasAttribute(Attribute::AttrKind Kind) const {
return AvailableAttrs & ((uint64_t)1) << Kind;
}
bool hasAttribute(StringRef Kind) const;
bool hasAttributes() const { return NumAttrs != 0; }

View File

@ -498,13 +498,6 @@ AttributeSetNode *AttributeSetNode::get(LLVMContext &C,
return PA;
}
bool AttributeSetNode::hasAttribute(Attribute::AttrKind Kind) const {
for (iterator I = begin(), E = end(); I != E; ++I)
if (I->hasAttribute(Kind))
return true;
return false;
}
bool AttributeSetNode::hasAttribute(StringRef Kind) const {
for (iterator I = begin(), E = end(); I != E; ++I)
if (I->hasAttribute(Kind))
@ -513,9 +506,11 @@ bool AttributeSetNode::hasAttribute(StringRef Kind) const {
}
Attribute AttributeSetNode::getAttribute(Attribute::AttrKind Kind) const {
for (iterator I = begin(), E = end(); I != E; ++I)
if (I->hasAttribute(Kind))
return *I;
if (hasAttribute(Kind)) {
for (iterator I = begin(), E = end(); I != E; ++I)
if (I->hasAttribute(Kind))
return *I;
}
return Attribute();
}