Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion mlir/include/mlir/Pass/PassOptions.h
Original file line number Diff line number Diff line change
Expand Up @@ -377,7 +377,7 @@ class PassOptions : protected llvm::cl::SubCommand {
/// ListOption<int> someListFlag{*this, "flag-name", llvm::cl::desc("...")};
/// };
template <typename T>
class PassPipelineOptions : public detail::PassOptions {
class PassPipelineOptions : public virtual detail::PassOptions {
public:
/// Factory that parses the provided options and returns a unique_ptr to the
/// struct.
Expand Down
10 changes: 10 additions & 0 deletions mlir/test/Pass/pipeline-options-parsing.mlir
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
// RUN: mlir-opt %s -verify-each=false -pass-pipeline='builtin.module(builtin.module(func.func(test-options-pass{list=3}), func.func(test-options-pass{enum=one list=1,2,3,4 string=foo"bar"baz})))' -dump-pass-pipeline 2>&1 | FileCheck --check-prefix=CHECK_6 %s
// RUN: mlir-opt %s -verify-each=false '-test-options-super-pass-pipeline=super-list={{enum=zero list=1 string=foo},{enum=one list=2 string="bar"},{enum=two list=3 string={baz}}}' -dump-pass-pipeline 2>&1 | FileCheck --check-prefix=CHECK_7 %s
// RUN: mlir-opt %s -verify-each=false -pass-pipeline='builtin.module(func.func(test-options-super-pass{list={{enum=zero list={1} string=foo },{enum=one list={2} string=bar },{enum=two list={3} string=baz }}}))' -dump-pass-pipeline 2>&1 | FileCheck --check-prefix=CHECK_7 %s
// RUN: mlir-opt %s -verify-each=false -test-options-super-set-ab-pipeline='foo=true bar=false' -dump-pass-pipeline 2>&1 | FileCheck --check-prefix=CHECK_11 %s


// This test checks that lists-of-nested-options like 'option1={...},{....}' can be parsed
Expand Down Expand Up @@ -106,3 +107,12 @@
// CHECK_10-NEXT: test-options-pass{enum=zero string= string-list={,}}
// CHECK_10-NEXT: )
// CHECK_10-NEXT: )

// CHECK_11: builtin.module(
// CHECK_11-NEXT: func.func(
// CHECK_11-NEXT: test-options-pass-a
// CHECK_11-NEXT: )
// CHECK_11-NEXT: func.func(
// CHECK_11-NEXT: test-options-pass-b
// CHECK_11-NEXT: )
// CHECK_11-NEXT: )
59 changes: 59 additions & 0 deletions mlir/test/lib/Pass/TestPassManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,51 @@ struct TestOptionsSuperPass
llvm::cl::desc("Example list of PassPipelineOptions option")};
};

struct TestOptionsPassA
: public PassWrapper<TestOptionsPassA, OperationPass<func::FuncOp>> {
MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(TestOptionsPassA)

struct Options : public PassPipelineOptions<Options> {
Option<bool> foo{*this, "foo", llvm::cl::desc("Example boolean option")};
};

TestOptionsPassA() = default;
TestOptionsPassA(const TestOptionsPassA &) : PassWrapper() {}
TestOptionsPassA(const Options &options) { this->options.foo = options.foo; }

void runOnOperation() final {}
StringRef getArgument() const final { return "test-options-pass-a"; }
StringRef getDescription() const final {
return "Test superset options parsing capabilities - subset A";
}

Options options;
};

struct TestOptionsPassB
: public PassWrapper<TestOptionsPassB, OperationPass<func::FuncOp>> {
MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(TestOptionsPassB)

struct Options : public PassPipelineOptions<Options> {
Option<bool> bar{*this, "bar", llvm::cl::desc("Example boolean option")};
};

TestOptionsPassB() = default;
TestOptionsPassB(const TestOptionsPassB &) : PassWrapper() {}
TestOptionsPassB(const Options &options) { this->options.bar = options.bar; }

void runOnOperation() final {}
StringRef getArgument() const final { return "test-options-pass-b"; }
StringRef getDescription() const final {
return "Test superset options parsing capabilities - subset B";
}

Options options;
};

struct TestPipelineOptionsSuperSetAB : TestOptionsPassA::Options,
TestOptionsPassB::Options {};

/// A test pass that always aborts to enable testing the crash recovery
/// mechanism of the pass manager.
struct TestCrashRecoveryPass
Expand Down Expand Up @@ -270,6 +315,9 @@ void registerPassManagerTestPass() {
PassRegistration<TestOptionsPass>();
PassRegistration<TestOptionsSuperPass>();

PassRegistration<TestOptionsPassA>();
PassRegistration<TestOptionsPassB>();

PassRegistration<TestModulePass>();

PassRegistration<TestFunctionPass>();
Expand Down Expand Up @@ -306,5 +354,16 @@ void registerPassManagerTestPass() {
[](OpPassManager &pm, const TestOptionsSuperPass::Options &options) {
pm.addPass(std::make_unique<TestOptionsSuperPass>(options));
});

PassPipelineRegistration<TestPipelineOptionsSuperSetAB>
registerPipelineOptionsSuperSetABPipeline(
"test-options-super-set-ab-pipeline",
"Parses options of PassPipelineOptions using pass pipeline "
"registration",
[](OpPassManager &pm, const TestPipelineOptionsSuperSetAB &options) {
// Pass superset AB options to subset options A and B
pm.addPass(std::make_unique<TestOptionsPassA>(options));
pm.addPass(std::make_unique<TestOptionsPassB>(options));
});
}
} // namespace mlir