From: River Riddle Date: Tue, 12 Nov 2019 21:03:39 +0000 (-0800) Subject: NFC: Change DictionaryAttr::get(StringRef) to use binary search instead of a linear... X-Git-Tag: llvmorg-11-init~1466^2~351 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=8082e3a687da76929e469ec76f86957c534f59db;p=platform%2Fupstream%2Fllvm.git 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 --- 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())