From 8082e3a687da76929e469ec76f86957c534f59db Mon Sep 17 00:00:00 2001 From: River Riddle Date: Tue, 12 Nov 2019 13:03:39 -0800 Subject: [PATCH] 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 --- mlir/lib/IR/Attributes.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/mlir/lib/IR/Attributes.cpp b/mlir/lib/IR/Attributes.cpp index 80ac4a5..5d7a4f08 100644 --- a/mlir/lib/IR/Attributes.cpp +++ b/mlir/lib/IR/Attributes.cpp @@ -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 value, @@ -155,10 +155,12 @@ ArrayRef 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 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()) -- 2.7.4