From 2a1a90722c9b8f330d73b844f96d723909f6073f Mon Sep 17 00:00:00 2001 From: Michael Jungmair Date: Tue, 10 Dec 2024 13:58:38 +0100 Subject: [PATCH 1/3] [mlir] Fix bug that prevents application of PrintingFlags in LocationSnapshotPass --- mlir/lib/Transforms/LocationSnapshot.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mlir/lib/Transforms/LocationSnapshot.cpp b/mlir/lib/Transforms/LocationSnapshot.cpp index b85850acda91b..b8f3817db9db6 100644 --- a/mlir/lib/Transforms/LocationSnapshot.cpp +++ b/mlir/lib/Transforms/LocationSnapshot.cpp @@ -140,7 +140,7 @@ struct LocationSnapshotPass void runOnOperation() override { Operation *op = getOperation(); - if (failed(generateLocationsFromIR(fileName, op, OpPrintingFlags(), tag))) + if (failed(generateLocationsFromIR(fileName, op, flags, tag))) return signalPassFailure(); } From f336b31ec45e92c7b89bc79a728f842a52518ab0 Mon Sep 17 00:00:00 2001 From: Mehdi Amini Date: Wed, 11 Dec 2024 12:06:43 -0800 Subject: [PATCH 2/3] Add support for passing selected OpPrintingFlags to the LocationSnapshot pass --- mlir/include/mlir/IR/OperationSupport.h | 10 ++++-- .../mlir/Transforms/LocationSnapshot.h | 12 ------- mlir/include/mlir/Transforms/Passes.td | 10 +++++- mlir/lib/IR/AsmPrinter.cpp | 19 ++++++++---- mlir/lib/Transforms/LocationSnapshot.cpp | 31 ++++++++----------- 5 files changed, 42 insertions(+), 40 deletions(-) diff --git a/mlir/include/mlir/IR/OperationSupport.h b/mlir/include/mlir/IR/OperationSupport.h index 1b93f3d3d04fe..027da77a4e8e5 100644 --- a/mlir/include/mlir/IR/OperationSupport.h +++ b/mlir/include/mlir/IR/OperationSupport.h @@ -1171,16 +1171,20 @@ class OpPrintingFlags { OpPrintingFlags &skipRegions(bool skip = true); /// Do not verify the operation when using custom operation printers. - OpPrintingFlags &assumeVerified(); + OpPrintingFlags &assumeVerified(bool enable = true); /// Use local scope when printing the operation. This allows for using the /// printer in a more localized and thread-safe setting, but may not /// necessarily be identical to what the IR will look like when dumping /// the full module. - OpPrintingFlags &useLocalScope(); + OpPrintingFlags &useLocalScope(bool enable = true); /// Print users of values as comments. - OpPrintingFlags &printValueUsers(); + OpPrintingFlags &printValueUsers(bool enable = true); + + /// Print unique SSA ID numbers for values, block arguments and naming + /// conflicts across all regions + OpPrintingFlags &printUniqueSSAIDs(bool enable = true); /// Return if the given ElementsAttr should be elided. bool shouldElideElementsAttr(ElementsAttr attr) const; diff --git a/mlir/include/mlir/Transforms/LocationSnapshot.h b/mlir/include/mlir/Transforms/LocationSnapshot.h index ccfdbac007ac4..cefe005d2c4c9 100644 --- a/mlir/include/mlir/Transforms/LocationSnapshot.h +++ b/mlir/include/mlir/Transforms/LocationSnapshot.h @@ -51,18 +51,6 @@ void generateLocationsFromIR(raw_ostream &os, StringRef fileName, StringRef tag, LogicalResult generateLocationsFromIR(StringRef fileName, StringRef tag, Operation *op, OpPrintingFlags flags); -/// Create a pass to generate new locations by snapshotting the IR to the given -/// file, and using the printed locations within that file. If `filename` is -/// empty, a temporary file is generated instead. If a 'tag' is non-empty, the -/// generated locations are represented as a NameLoc with the given tag as the -/// name, and then fused with the existing locations. Otherwise, the existing -/// locations are replaced. -std::unique_ptr createLocationSnapshotPass(OpPrintingFlags flags, - StringRef fileName = "", - StringRef tag = ""); -/// Overload utilizing pass options for initialization. -std::unique_ptr createLocationSnapshotPass(); - } // namespace mlir #endif // MLIR_TRANSFORMS_LOCATIONSNAPSHOT_H diff --git a/mlir/include/mlir/Transforms/Passes.td b/mlir/include/mlir/Transforms/Passes.td index 000d9f697618e..c4a8e7a81fa48 100644 --- a/mlir/include/mlir/Transforms/Passes.td +++ b/mlir/include/mlir/Transforms/Passes.td @@ -331,13 +331,21 @@ def LocationSnapshot : Pass<"snapshot-op-locations"> { ... loc(fused["original_source.cpp":1:1, "snapshot"("snapshot_source.mlir":10:10)]) ``` }]; - let constructor = "mlir::createLocationSnapshotPass()"; let options = [ Option<"fileName", "filename", "std::string", /*default=*/"", "The filename to print the generated IR">, Option<"tag", "tag", "std::string", /*default=*/"", "A tag to use when fusing the new locations with the " "original. If unset, the locations are replaced.">, + Option<"enableDebugInfo", "print-debuginfo", "bool", /*default=*/"false", + "Print debug info in MLIR output">, + Option<"printGenericOpForm", "print-op-generic", "bool", /*default=*/"false", + "Print the generic op form">, + Option<"useLocalScope", "print-local-scope", "bool", /*default=*/"false", + "Print with local scope and inline information (eliding " + "aliases for attributes, types, and locations">, + Option<"printPrettyDebugInfo", "pretty-debuginfo", "bool", /*default=*/"false", + "Print pretty debug info in MLIR output">, ]; } diff --git a/mlir/lib/IR/AsmPrinter.cpp b/mlir/lib/IR/AsmPrinter.cpp index 61b90bc9b0a7b..b88bbb8e6ac38 100644 --- a/mlir/lib/IR/AsmPrinter.cpp +++ b/mlir/lib/IR/AsmPrinter.cpp @@ -277,22 +277,29 @@ OpPrintingFlags &OpPrintingFlags::skipRegions(bool skip) { } /// Do not verify the operation when using custom operation printers. -OpPrintingFlags &OpPrintingFlags::assumeVerified() { - assumeVerifiedFlag = true; +OpPrintingFlags &OpPrintingFlags::assumeVerified(bool enable) { + assumeVerifiedFlag = enable; return *this; } /// Use local scope when printing the operation. This allows for using the /// printer in a more localized and thread-safe setting, but may not necessarily /// be identical of what the IR will look like when dumping the full module. -OpPrintingFlags &OpPrintingFlags::useLocalScope() { - printLocalScope = true; +OpPrintingFlags &OpPrintingFlags::useLocalScope(bool enable) { + printLocalScope = enable; return *this; } /// Print users of values as comments. -OpPrintingFlags &OpPrintingFlags::printValueUsers() { - printValueUsersFlag = true; +OpPrintingFlags &OpPrintingFlags::printValueUsers(bool enable) { + printValueUsersFlag = enable; + return *this; +} + +/// Print unique SSA ID numbers for values, block arguments and naming conflicts +/// across all regions +OpPrintingFlags &OpPrintingFlags::printUniqueSSAIDs(bool enable) { + printUniqueSSAIDsFlag = enable; return *this; } diff --git a/mlir/lib/Transforms/LocationSnapshot.cpp b/mlir/lib/Transforms/LocationSnapshot.cpp index b8f3817db9db6..f701c8b4f0a91 100644 --- a/mlir/lib/Transforms/LocationSnapshot.cpp +++ b/mlir/lib/Transforms/LocationSnapshot.cpp @@ -10,6 +10,7 @@ #include "mlir/IR/AsmState.h" #include "mlir/IR/Builders.h" +#include "mlir/IR/OperationSupport.h" #include "mlir/Pass/Pass.h" #include "mlir/Support/FileUtilities.h" #include "llvm/Support/FileSystem.h" @@ -131,29 +132,23 @@ LogicalResult mlir::generateLocationsFromIR(StringRef fileName, StringRef tag, namespace { struct LocationSnapshotPass : public impl::LocationSnapshotBase { - LocationSnapshotPass() = default; - LocationSnapshotPass(OpPrintingFlags flags, StringRef fileName, StringRef tag) - : flags(flags) { - this->fileName = fileName.str(); - this->tag = tag.str(); - } + using impl::LocationSnapshotBase::LocationSnapshotBase; void runOnOperation() override { Operation *op = getOperation(); - if (failed(generateLocationsFromIR(fileName, op, flags, tag))) + if (failed(generateLocationsFromIR(fileName, op, getFlags(), tag))) return signalPassFailure(); } - /// The printing flags to use when creating the snapshot. - OpPrintingFlags flags; +private: + /// build the flags from the command line arguments to the pass + OpPrintingFlags getFlags() { + OpPrintingFlags flags; + flags.enableDebugInfo(enableDebugInfo, printPrettyDebugInfo); + flags.printGenericOpForm(printGenericOpForm); + if (useLocalScope) + flags.useLocalScope(); + return flags; + } }; } // namespace - -std::unique_ptr mlir::createLocationSnapshotPass(OpPrintingFlags flags, - StringRef fileName, - StringRef tag) { - return std::make_unique(flags, fileName, tag); -} -std::unique_ptr mlir::createLocationSnapshotPass() { - return std::make_unique(); -} From 98c1faeaa86d7a278dffc787e92cd673f21422b8 Mon Sep 17 00:00:00 2001 From: Michael Jungmair Date: Thu, 12 Dec 2024 13:47:34 +0100 Subject: [PATCH 3/3] Add test for passing OpPrintingFlags to LocationSnapshotPass in mlir-opt --- mlir/test/Transforms/location-snapshot.mlir | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/mlir/test/Transforms/location-snapshot.mlir b/mlir/test/Transforms/location-snapshot.mlir index 9f48cb6e3b3fe..aeddfedd08ae5 100644 --- a/mlir/test/Transforms/location-snapshot.mlir +++ b/mlir/test/Transforms/location-snapshot.mlir @@ -1,5 +1,6 @@ // RUN: mlir-opt -allow-unregistered-dialect -snapshot-op-locations='filename=%/t' -mlir-print-local-scope -mlir-print-debuginfo %s | FileCheck %s -DFILE=%/t // RUN: mlir-opt -allow-unregistered-dialect -snapshot-op-locations='filename=%/t tag='tagged'' -mlir-print-local-scope -mlir-print-debuginfo %s | FileCheck %s --check-prefix=TAG -DFILE=%/t +// RUN: mlir-opt -allow-unregistered-dialect -snapshot-op-locations='filename=%/t print-debuginfo' -mlir-print-local-scope -mlir-print-debuginfo %s | FileCheck %s --check-prefix=DBG -DFILE=%/t && cat %/t | FileCheck %s --check-prefix=DBGFILE // CHECK: func @function( // CHECK-NEXT: loc("[[FILE]]":{{[0-9]+}}:{{[0-9]+}}) @@ -15,3 +16,18 @@ func.func @function() -> i32 { %1 = "foo"() : () -> i32 loc("original") return %1 : i32 loc("original") } loc("original") + +// DBG: func @function2( +// DBG-NEXT: loc("[[FILE]]":{{[0-9]+}}:{{[0-9]+}}) +// DBG-NEXT: loc("[[FILE]]":{{[0-9]+}}:{{[0-9]+}}) +// DBG-NEXT: } loc("[[FILE]]":{{[0-9]+}}:{{[0-9]+}}) + +// DBGFILE: func @function2( +// DBGFILE-NEXT: loc("{{.*}}location-snapshot.mlir":{{[0-9]+}}:{{[0-9]+}}) +// DBGFILE-NEXT: loc("{{.*}}location-snapshot.mlir":{{[0-9]+}}:{{[0-9]+}}) +// DBGFILE-NEXT: } loc("{{.*}}location-snapshot.mlir":{{[0-9]+}}:{{[0-9]+}}) + +func.func @function2() -> i32 { + %1 = "foo"() : () -> i32 + return %1 : i32 +} \ No newline at end of file