NFC: Change DictionaryAttr::get(StringRef) to use binary search instead of a linear scan.

The elements of a DictionaryAttr are guaranteed to be sorted by name, so we can use a more efficient lookup when searching for an attribute.

PiperOrigin-RevId: 280035488
This commit is contained in:
River Riddle 2019-11-12 13:03:39 -08:00 committed by A. Unique TensorFlower
parent 9d985141ef
commit 8082e3a687
1 changed files with 7 additions and 5 deletions

View File

@ -91,7 +91,7 @@ bool BoolAttr::getValue() const { return getImpl()->value; }
/// NamedAttributes.
static int compareNamedAttributes(const NamedAttribute *lhs,
const NamedAttribute *rhs) {
return lhs->first.str().compare(rhs->first.str());
return lhs->first.strref().compare(rhs->first.strref());
}
DictionaryAttr DictionaryAttr::get(ArrayRef<NamedAttribute> value,
@ -155,10 +155,12 @@ ArrayRef<NamedAttribute> DictionaryAttr::getValue() const {
/// Return the specified attribute if present, null otherwise.
Attribute DictionaryAttr::get(StringRef name) const {
for (auto elt : getValue())
if (elt.first.is(name))
return elt.second;
return nullptr;
ArrayRef<NamedAttribute> values = getValue();
auto compare = [](NamedAttribute attr, StringRef name) {
return attr.first.strref() < name;
};
auto it = llvm::lower_bound(values, name, compare);
return it != values.end() && it->first.is(name) ? it->second : Attribute();
}
Attribute DictionaryAttr::get(Identifier name) const {
for (auto elt : getValue())