diff options
Diffstat (limited to 'mlir/lib/IR/AsmPrinter.cpp')
| -rw-r--r-- | mlir/lib/IR/AsmPrinter.cpp | 42 |
1 files changed, 27 insertions, 15 deletions
diff --git a/mlir/lib/IR/AsmPrinter.cpp b/mlir/lib/IR/AsmPrinter.cpp index 655a776118c..1d3f9d74403 100644 --- a/mlir/lib/IR/AsmPrinter.cpp +++ b/mlir/lib/IR/AsmPrinter.cpp @@ -733,6 +733,19 @@ static void printSymbolReference(StringRef symbolRef, raw_ostream &os) { os << '"'; } +// Print out a valid ElementsAttr that is succinct and can represent any +// potential shape/type, for use when eliding a large ElementsAttr. +// +// We choose to use an opaque ElementsAttr literal with conspicuous content to +// hopefully alert readers to the fact that this has been elided. +// +// Unfortunately, neither of the strings of an opaque ElementsAttr literal will +// accept the string "elided". The first string must be a registered dialect +// name and the latter must be a hex constant. +static void printElidedElementsAttr(raw_ostream &os) { + os << R"(opaque<"", "0xDEADBEEF">)"; +} + void ModulePrinter::printAttribute(Attribute attr, bool mayElideType) { if (!attr) { os << "<<NULL ATTRIBUTE>>"; @@ -836,19 +849,20 @@ void ModulePrinter::printAttribute(Attribute attr, bool mayElideType) { } case StandardAttributes::OpaqueElements: { auto eltsAttr = attr.cast<OpaqueElementsAttr>(); + if (printerFlags.shouldElideElementsAttr(eltsAttr)) { + printElidedElementsAttr(os); + break; + } os << "opaque<\"" << eltsAttr.getDialect()->getNamespace() << "\", "; - os << '"' << "0x"; - - // Check for large ElementsAttr elision. - if (printerFlags.shouldElideElementsAttr(eltsAttr)) - os << "..."; - else - os << llvm::toHex(eltsAttr.getValue()); - os << "\">"; + os << '"' << "0x" << llvm::toHex(eltsAttr.getValue()) << "\">"; break; } case StandardAttributes::DenseElements: { auto eltsAttr = attr.cast<DenseElementsAttr>(); + if (printerFlags.shouldElideElementsAttr(eltsAttr)) { + printElidedElementsAttr(os); + break; + } os << "dense<"; printDenseElementsAttr(eltsAttr); os << '>'; @@ -856,6 +870,11 @@ void ModulePrinter::printAttribute(Attribute attr, bool mayElideType) { } case StandardAttributes::SparseElements: { auto elementsAttr = attr.cast<SparseElementsAttr>(); + if (printerFlags.shouldElideElementsAttr(elementsAttr.getIndices()) || + printerFlags.shouldElideElementsAttr(elementsAttr.getValues())) { + printElidedElementsAttr(os); + break; + } os << "sparse<"; printDenseElementsAttr(elementsAttr.getIndices()); os << ", "; @@ -916,13 +935,6 @@ void ModulePrinter::printDenseElementsAttr(DenseElementsAttr attr) { return; } - // Check for large elements attr elision. We explicitly check *after* splat, - // as the splat printing is already elided. - if (printerFlags.shouldElideElementsAttr(attr)) { - os << "..."; - return; - } - // Special case for degenerate tensors. auto numElements = type.getNumElements(); if (numElements == 0) { |

