[Mlir-commits] [mlir] f175ba4 - [mlir][AsmPrinter] Don't use string comparison when filtering list attributes
River Riddle
llvmlistbot at llvm.org
Fri Mar 5 12:47:16 PST 2021
Author: River Riddle
Date: 2021-03-05T12:47:05-08:00
New Revision: f175ba4a54d3dccfb691138c0c47ca862f03c7db
URL: https://github.com/llvm/llvm-project/commit/f175ba4a54d3dccfb691138c0c47ca862f03c7db
DIFF: https://github.com/llvm/llvm-project/commit/f175ba4a54d3dccfb691138c0c47ca862f03c7db.diff
LOG: [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
Added:
Modified:
mlir/lib/IR/AsmPrinter.cpp
Removed:
################################################################################
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 @@ class DummyAliasOperationPrinter : private OpAsmPrinter {
/// 'elidedAttrs'.
void printOptionalAttrDict(ArrayRef<NamedAttribute> attrs,
ArrayRef<StringRef> elidedAttrs = {}) override {
- // Filter out any attributes that shouldn't be included.
- SmallVector<NamedAttribute, 8> 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<StringRef> elidedAttrsSet(elidedAttrs.begin(),
+ elidedAttrs.end());
+ for (const NamedAttribute &attr : attrs)
+ if (!elidedAttrsSet.contains(attr.first.strref()))
+ printAttribute(attr.second);
}
void printOptionalAttrDictWithKeyword(
ArrayRef<NamedAttribute> attrs,
@@ -1916,25 +1921,31 @@ void ModulePrinter::printOptionalAttrDict(ArrayRef<NamedAttribute> attrs,
if (attrs.empty())
return;
- // Filter out any attributes that shouldn't be included.
- SmallVector<NamedAttribute, 8> 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<StringRef> 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) {
More information about the Mlir-commits
mailing list