[mlir] Catch the case using ir print without disabling multithread
authorKai Sasaki <lewuathe@gmail.com>
Sun, 2 Apr 2023 06:39:27 +0000 (15:39 +0900)
committerKai Sasaki <lewuathe@gmail.com>
Sun, 2 Apr 2023 06:47:11 +0000 (15:47 +0900)
-mlir-print-ir-module-scope option cannot be used without disabling multithread for pass manager. For the usability, we can throw a validation error in mlir-opt instead of assertion failure.

Issue: https://github.com/llvm/llvm-project/issues/61578

Reviewed By: mehdi_amini

Differential Revision: https://reviews.llvm.org/D146785

mlir/include/mlir/Pass/PassManager.h
mlir/lib/Pass/PassManagerOptions.cpp
mlir/lib/Tools/mlir-opt/MlirOptMain.cpp
mlir/test/Pass/invalid-pass.mlir

index 71982c3..c7cf37a 100644 (file)
@@ -461,7 +461,7 @@ void registerPassManagerCLOptions();
 
 /// Apply any values provided to the pass manager options that were registered
 /// with 'registerPassManagerOptions'.
-void applyPassManagerCLOptions(PassManager &pm);
+LogicalResult applyPassManagerCLOptions(PassManager &pm);
 
 /// Apply any values provided to the timing manager options that were registered
 /// with `registerDefaultTimingManagerOptions`. This is a handy helper function
index 7b725b2..ffc53b7 100644 (file)
@@ -130,9 +130,9 @@ void mlir::registerPassManagerCLOptions() {
   *options;
 }
 
-void mlir::applyPassManagerCLOptions(PassManager &pm) {
+LogicalResult mlir::applyPassManagerCLOptions(PassManager &pm) {
   if (!options.isConstructed())
-    return;
+    return failure();
 
   // Generate a reproducer on crash/failure.
   if (options->reproducerFile.getNumOccurrences())
@@ -143,8 +143,16 @@ void mlir::applyPassManagerCLOptions(PassManager &pm) {
   if (options->passStatistics)
     pm.enableStatistics(options->passStatisticsDisplayMode);
 
+  if (options->printModuleScope && pm.getContext()->isMultithreadingEnabled()) {
+    emitError(UnknownLoc::get(pm.getContext()))
+        << "IR print for module scope can't be setup on a pass-manager "
+           "without disabling multi-threading first.\n";
+    return failure();
+  }
+
   // Add the IR printing instrumentation.
   options->addPrinterInstrumentation(pm);
+  return success();
 }
 
 void mlir::applyDefaultTimingPassManagerCLOptions(PassManager &pm) {
index 14f702f..dfc5117 100644 (file)
@@ -210,7 +210,8 @@ performActions(raw_ostream &os,
   // Prepare the pass manager, applying command-line and reproducer options.
   PassManager pm(op.get()->getName(), PassManager::Nesting::Implicit);
   pm.enableVerifier(config.shouldVerifyPasses());
-  applyPassManagerCLOptions(pm);
+  if (failed(applyPassManagerCLOptions(pm)))
+    return failure();
   pm.enableTiming(timing);
   if (failed(reproOptions.apply(pm)) || failed(config.setupPassPipeline(pm)))
     return failure();
index c9e37cc..649f723 100644 (file)
@@ -1,6 +1,9 @@
 // RUN: not mlir-opt %s -pass-pipeline='builtin.module(builtin.module(test-module-pass{test-option=a}))' 2>&1 | FileCheck %s
+// RUN: not mlir-opt %s -mlir-print-ir-module-scope -mlir-print-ir-before=cse 2>&1 | FileCheck -check-prefix=PRINT_MODULE_IR_WITH_MULTITHREAD %s
 
 // CHECK: <Pass-Options-Parser>: no such option test-option
 // CHECK: failed to add `test-module-pass` with options `test-option=a`
 // CHECK: failed to add `builtin.module` with options `` to inner pipeline
 module {}
+
+// PRINT_MODULE_IR_WITH_MULTITHREAD: IR print for module scope can't be setup on a pass-manager without disabling multi-threading first.