[mlir][reducer] Add opt-pass-file option to opt-reduction pass (#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.
This commit is contained in:
lonely eagle 2026-04-05 12:55:21 +08:00 committed by GitHub
parent 66483dfe34
commit d08bb68080
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 22 additions and 1 deletions

View File

@ -40,6 +40,8 @@ def OptReductionPass : Pass<"opt-reduction-pass"> {
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;
}

View File

@ -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
@ -47,8 +48,21 @@ void OptReductionPass::runOnOperation() {
Tester test(testerName, testerArgs);
Operation *topOp = this->getOperation();
std::string pipelineStr = optPass;
if (pipelineStr.empty()) {
if (!optPassFile.empty()) {
auto fileOrErr = llvm::MemoryBuffer::getFile(optPassFile);
if (std::error_code ec = fileOrErr.getError()) {
topOp->emitError() << "Could not open pass pipeline file: "
<< optPassFile << " (" << ec.message() << ")";
return signalPassFailure();
}
pipelineStr = fileOrErr.get()->getBuffer().trim().str();
}
}
PassManager passManager(topOp->getName());
if (failed(parsePassPipeline(optPass, passManager))) {
if (failed(parsePassPipeline(pipelineStr, passManager))) {
topOp->emitError() << "\nfailed to parse pass pipeline";
return signalPassFailure();
}

View File

@ -0,0 +1 @@
symbol-dce

View File

@ -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