From 470f3cee3557974bb1820722bf82d86b8909199b Mon Sep 17 00:00:00 2001 From: Kai Sasaki Date: Sun, 2 Apr 2023 15:39:27 +0900 Subject: [PATCH] [mlir] Catch the case using ir print without disabling multithread -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 | 2 +- mlir/lib/Pass/PassManagerOptions.cpp | 12 ++++++++++-- mlir/lib/Tools/mlir-opt/MlirOptMain.cpp | 3 ++- mlir/test/Pass/invalid-pass.mlir | 3 +++ 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/mlir/include/mlir/Pass/PassManager.h b/mlir/include/mlir/Pass/PassManager.h index 71982c3..c7cf37a 100644 --- a/mlir/include/mlir/Pass/PassManager.h +++ b/mlir/include/mlir/Pass/PassManager.h @@ -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 diff --git a/mlir/lib/Pass/PassManagerOptions.cpp b/mlir/lib/Pass/PassManagerOptions.cpp index 7b725b2..ffc53b7 100644 --- a/mlir/lib/Pass/PassManagerOptions.cpp +++ b/mlir/lib/Pass/PassManagerOptions.cpp @@ -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) { diff --git a/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp b/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp index 14f702f..dfc5117 100644 --- a/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp +++ b/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp @@ -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(); diff --git a/mlir/test/Pass/invalid-pass.mlir b/mlir/test/Pass/invalid-pass.mlir index c9e37cc..649f723 100644 --- 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. -- 2.7.4