diff --git a/mlir/include/mlir/Pass/PassManager.h b/mlir/include/mlir/Pass/PassManager.h index c770177c517be..3117d0f33dc6b 100644 --- a/mlir/include/mlir/Pass/PassManager.h +++ b/mlir/include/mlir/Pass/PassManager.h @@ -139,6 +139,10 @@ class PassManager : public OpPassManager { /// Disable support for multi-threading within the pass manager. void disableMultithreading(bool disable = true); + /// Return true if the pass manager is configured with multi-threading + /// enabled. + bool isMultithreadingEnabled(); + /// Enable support for the pass manager to generate a reproducer on the event /// of a crash or a pass failure. `outputFile` is a .mlir filename used to /// write the generated reproducer. diff --git a/mlir/lib/Pass/IRPrinting.cpp b/mlir/lib/Pass/IRPrinting.cpp index 0374b00cbe4db..b1792c4976200 100644 --- a/mlir/lib/Pass/IRPrinting.cpp +++ b/mlir/lib/Pass/IRPrinting.cpp @@ -256,6 +256,9 @@ struct BasicIRPrinterConfig : public PassManager::IRPrinterConfig { /// Add an instrumentation to print the IR before and after pass execution, /// using the provided configuration. void PassManager::enableIRPrinting(std::unique_ptr config) { + if (config->shouldPrintAtModuleScope() && isMultithreadingEnabled()) + llvm::report_fatal_error("IR printing can't be setup on a pass-manager " + "without disabling multi-threading first."); addInstrumentation( std::make_unique(std::move(config))); } diff --git a/mlir/lib/Pass/Pass.cpp b/mlir/lib/Pass/Pass.cpp index 41adb623e74d6..68be02e7eb1c8 100644 --- a/mlir/lib/Pass/Pass.cpp +++ b/mlir/lib/Pass/Pass.cpp @@ -598,6 +598,10 @@ void PassManager::disableMultithreading(bool disable) { getImpl().disableThreads = disable; } +bool PassManager::isMultithreadingEnabled() { + return !getImpl().disableThreads; +} + /// Enable support for the pass manager to generate a reproducer on the event /// of a crash or a pass failure. `outputFile` is a .mlir filename used to write /// the generated reproducer.