diff --git a/mlir/include/mlir/Pass/PassManager.h b/mlir/include/mlir/Pass/PassManager.h --- a/mlir/include/mlir/Pass/PassManager.h +++ b/mlir/include/mlir/Pass/PassManager.h @@ -461,7 +461,7 @@ /// 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 diff --git a/mlir/lib/Pass/PassManagerOptions.cpp b/mlir/lib/Pass/PassManagerOptions.cpp --- a/mlir/lib/Pass/PassManagerOptions.cpp +++ b/mlir/lib/Pass/PassManagerOptions.cpp @@ -130,9 +130,9 @@ *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 @@ if (options->passStatistics) pm.enableStatistics(options->passStatisticsDisplayMode); + if (options->printModuleScope && pm.getContext()->isMultithreadingEnabled()) { + llvm::errs() + << "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) { diff --git a/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp b/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp --- a/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp +++ b/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp @@ -210,7 +210,8 @@ // 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(); diff --git a/mlir/test/Pass/invalid-pass.mlir b/mlir/test/Pass/invalid-pass.mlir --- a/mlir/test/Pass/invalid-pass.mlir +++ b/mlir/test/Pass/invalid-pass.mlir @@ -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: : 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.