From f175ba4a54d3dccfb691138c0c47ca862f03c7db Mon Sep 17 00:00:00 2001 From: River Riddle Date: Fri, 5 Mar 2021 12:42:24 -0800 Subject: [PATCH] [mlir][AsmPrinter] Don't use string comparison when filtering list attributes In .mlir modules with larges amounts of attributes, e.g. a function with a larger number of argument attributes, the string comparison filtering greatly affects compile time. This revision switches to using a SmallDenseSet in these situations, resulting in over a 10x speed up in some situations. Differential Revision: https://reviews.llvm.org/D97980 --- mlir/lib/IR/AsmPrinter.cpp | 57 +++++++++++++++++++++++--------------- 1 file changed, 34 insertions(+), 23 deletions(-) diff --git a/mlir/lib/IR/AsmPrinter.cpp b/mlir/lib/IR/AsmPrinter.cpp index c0b20c064a78..722fbe4f2e5f 100644 --- a/mlir/lib/IR/AsmPrinter.cpp +++ b/mlir/lib/IR/AsmPrinter.cpp @@ -441,13 +441,18 @@ private: /// 'elidedAttrs'. void printOptionalAttrDict(ArrayRef attrs, ArrayRef elidedAttrs = {}) override { - // Filter out any attributes that shouldn't be included. - SmallVector filteredAttrs( - llvm::make_filter_range(attrs, [&](NamedAttribute attr) { - return !llvm::is_contained(elidedAttrs, attr.first.strref()); - })); - for (const NamedAttribute &attr : filteredAttrs) - printAttribute(attr.second); + if (attrs.empty()) + return; + if (elidedAttrs.empty()) { + for (const NamedAttribute &attr : attrs) + printAttribute(attr.second); + return; + } + llvm::SmallDenseSet elidedAttrsSet(elidedAttrs.begin(), + elidedAttrs.end()); + for (const NamedAttribute &attr : attrs) + if (!elidedAttrsSet.contains(attr.first.strref())) + printAttribute(attr.second); } void printOptionalAttrDictWithKeyword( ArrayRef attrs, @@ -1916,25 +1921,31 @@ void ModulePrinter::printOptionalAttrDict(ArrayRef attrs, if (attrs.empty()) return; - // Filter out any attributes that shouldn't be included. - SmallVector filteredAttrs( - llvm::make_filter_range(attrs, [&](NamedAttribute attr) { - return !llvm::is_contained(elidedAttrs, attr.first.strref()); - })); + // Functor used to print a filtered attribute list. + auto printFilteredAttributesFn = [&](auto filteredAttrs) { + // Print the 'attributes' keyword if necessary. + if (withKeyword) + os << " attributes"; - // If there are no attributes left to print after filtering, then we're done. - if (filteredAttrs.empty()) - return; + // Otherwise, print them all out in braces. + os << " {"; + interleaveComma(filteredAttrs, + [&](NamedAttribute attr) { printNamedAttribute(attr); }); + os << '}'; + }; - // Print the 'attributes' keyword if necessary. - if (withKeyword) - os << " attributes"; + // If no attributes are elided, we can directly print with no filtering. + if (elidedAttrs.empty()) + return printFilteredAttributesFn(attrs); - // Otherwise, print them all out in braces. - os << " {"; - interleaveComma(filteredAttrs, - [&](NamedAttribute attr) { printNamedAttribute(attr); }); - os << '}'; + // Otherwise, filter out any attributes that shouldn't be included. + llvm::SmallDenseSet elidedAttrsSet(elidedAttrs.begin(), + elidedAttrs.end()); + auto filteredAttrs = llvm::make_filter_range(attrs, [&](NamedAttribute attr) { + return !elidedAttrsSet.contains(attr.first.strref()); + }); + if (!filteredAttrs.empty()) + printFilteredAttributesFn(filteredAttrs); } void ModulePrinter::printNamedAttribute(NamedAttribute attr) {