[Mlir-commits] [mlir] [mlir][reducer] Add opt-pass-file option to opt-reduction pass (PR #189353)

lonely eagle llvmlistbot at llvm.org
Mon Mar 30 03:53:46 PDT 2026


https://github.com/linuxlonelyeagle created https://github.com/llvm/llvm-project/pull/189353

Currently, the opt-reduction-pass only supports inputting the optimization pipeline via the command line, which becomes cumbersome when the pipeline is long. To address this, this PR introduces the opt-pass-file option. This allows users to save the pipeline in a file and provide the filename to parse the pipeline.

>From e3761c04df2f3c95f52888e4a5114b7fc8bfdbef Mon Sep 17 00:00:00 2001
From: linuxlonelyeagle <2020382038 at qq.com>
Date: Mon, 30 Mar 2026 10:49:37 +0000
Subject: [PATCH] add opt-pass-file option to opt-reduction pass.

---
 mlir/include/mlir/Reducer/Passes.td   |  2 ++
 mlir/lib/Reducer/OptReductionPass.cpp | 19 +++++++++++++++----
 mlir/test/mlir-reduce/dce-pipeline    |  1 +
 mlir/test/mlir-reduce/dce-test.mlir   |  4 ++++
 4 files changed, 22 insertions(+), 4 deletions(-)
 create mode 100644 mlir/test/mlir-reduce/dce-pipeline

diff --git a/mlir/include/mlir/Reducer/Passes.td b/mlir/include/mlir/Reducer/Passes.td
index 624e2e1edc329..220303eb39e74 100644
--- a/mlir/include/mlir/Reducer/Passes.td
+++ b/mlir/include/mlir/Reducer/Passes.td
@@ -40,6 +40,8 @@ def OptReductionPass : Pass<"opt-reduction-pass", "ModuleOp"> {
   let options = [
     Option<"optPass", "opt-pass", "std::string", /* default */"",
            "The optimization passes used for reduction, e.g., symbol-dce">,
+    Option<"optPassFile", "opt-pass-file", "std::string", /* default */"",
+           "The file path containing the optimization pipeline definition">,
   ] # CommonReductionPassOptions.options;
 }
 
diff --git a/mlir/lib/Reducer/OptReductionPass.cpp b/mlir/lib/Reducer/OptReductionPass.cpp
index 4bdc7b17567d9..99b0b0ddc3ec6 100644
--- a/mlir/lib/Reducer/OptReductionPass.cpp
+++ b/mlir/lib/Reducer/OptReductionPass.cpp
@@ -18,6 +18,7 @@
 #include "mlir/Reducer/Tester.h"
 
 #include "llvm/Support/DebugLog.h"
+#include "llvm/Support/MemoryBuffer.h"
 
 namespace mlir {
 #define GEN_PASS_DEF_OPTREDUCTIONPASS
@@ -45,16 +46,26 @@ void OptReductionPass::runOnOperation() {
   LDBG() << "\nOptimization Reduction pass: ";
 
   Tester test(testerName, testerArgs);
-
   ModuleOp module = this->getOperation();
-  ModuleOp moduleVariant = module.clone();
-
+  std::string pipelineStr = optPass;
+  if (pipelineStr.empty()) {
+    if (!optPassFile.empty()) {
+      auto fileOrErr = llvm::MemoryBuffer::getFile(optPassFile);
+      if (std::error_code ec = fileOrErr.getError()) {
+        module.emitError() << "Could not open pass pipeline file: "
+                           << optPassFile << " (" << ec.message() << ")";
+        return signalPassFailure();
+      }
+      pipelineStr = fileOrErr.get()->getBuffer().trim().str();
+    }
+  }
   OpPassManager passManager("builtin.module");
-  if (failed(parsePassPipeline(optPass, passManager))) {
+  if (failed(parsePassPipeline(pipelineStr, passManager))) {
     module.emitError() << "\nfailed to parse pass pipeline";
     return signalPassFailure();
   }
 
+  ModuleOp moduleVariant = module.clone();
   std::pair<Tester::Interestingness, int> original = test.isInteresting(module);
   if (original.first != Tester::Interestingness::True) {
     module.emitError() << "\nthe original input is not interested";
diff --git a/mlir/test/mlir-reduce/dce-pipeline b/mlir/test/mlir-reduce/dce-pipeline
new file mode 100644
index 0000000000000..92fc1ea2acc03
--- /dev/null
+++ b/mlir/test/mlir-reduce/dce-pipeline
@@ -0,0 +1 @@
+symbol-dce
diff --git a/mlir/test/mlir-reduce/dce-test.mlir b/mlir/test/mlir-reduce/dce-test.mlir
index 57b5fd9c2ea73..e81cad3ef9f21 100644
--- a/mlir/test/mlir-reduce/dce-test.mlir
+++ b/mlir/test/mlir-reduce/dce-test.mlir
@@ -1,16 +1,20 @@
 // UNSUPPORTED: system-windows
 // RUN: mlir-reduce %s -opt-reduction-pass='opt-pass=symbol-dce test=%S/failure-test.sh' | FileCheck %s
+// RUN: mlir-reduce %s -opt-reduction-pass='opt-pass-file=%S/dce-pipeline test=%S/failure-test.sh' | FileCheck %s  --check-prefix=CHECK-OPT-FILE
 // This input should be reduced by the pass pipeline so that only
 // the @simple1 function remains as the other functions should be
 // removed by the dead code elimination pass.
 
 // CHECK-NOT: func private @dead_private_function
+// CHECK-OPT-FILE-NOT: func private @dead_private_function
 func.func private @dead_private_function()
 
 // CHECK-NOT: func nested @dead_nested_function
+// CHECK-OPT-FILE-NOT: funcnested @dead_nested_function
 func.func nested @dead_nested_function()
 
 // CHECK-LABEL: func @simple1(%arg0: i1, %arg1: memref<2xf32>, %arg2: memref<2xf32>) {
+// CHECK-OPT-FILE-LABEL: func @simple1(%arg0: i1, %arg1: memref<2xf32>, %arg2: memref<2xf32>) {
 func.func @simple1(%arg0: i1, %arg1: memref<2xf32>, %arg2: memref<2xf32>) {
   "test.op_crash" () : () -> ()
   return



More information about the Mlir-commits mailing list