NFC: Change DictionaryAttr::get(StringRef) to use binary search instead of a linear...
authorRiver Riddle <riverriddle@google.com>
Tue, 12 Nov 2019 21:03:39 +0000 (13:03 -0800)
committerA. Unique TensorFlower <gardener@tensorflow.org>
Tue, 12 Nov 2019 21:04:14 +0000 (13:04 -0800)
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

mlir/lib/IR/Attributes.cpp

index 80ac4a5..5d7a4f0 100644 (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())