summaryrefslogtreecommitdiff
path: root/llvm/unittests/SandboxIR/PassTest.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/unittests/SandboxIR/PassTest.cpp')
-rw-r--r--llvm/unittests/SandboxIR/PassTest.cpp104
1 files changed, 49 insertions, 55 deletions
diff --git a/llvm/unittests/SandboxIR/PassTest.cpp b/llvm/unittests/SandboxIR/PassTest.cpp
index b380ae9fd475..ae7284ecf2de 100644
--- a/llvm/unittests/SandboxIR/PassTest.cpp
+++ b/llvm/unittests/SandboxIR/PassTest.cpp
@@ -180,12 +180,10 @@ define void @foo() {
};
unsigned BBCnt1 = 0;
unsigned BBCnt2 = 0;
- TestPass1 TPass1(BBCnt1);
- TestPass2 TPass2(BBCnt2);
FunctionPassManager FPM("test-fpm");
- FPM.addPass(&TPass1);
- FPM.addPass(&TPass2);
+ FPM.addPass(std::make_unique<TestPass1>(BBCnt1));
+ FPM.addPass(std::make_unique<TestPass2>(BBCnt2));
// Check runOnFunction().
FPM.runOnFunction(*F);
EXPECT_EQ(BBCnt1, 1u);
@@ -238,12 +236,10 @@ define i8 @foo(i8 %v0, i8 %v1) {
};
unsigned InstCount1 = 0;
unsigned InstCount2 = 0;
- TestPass1 TPass1(InstCount1);
- TestPass2 TPass2(InstCount2);
RegionPassManager RPM("test-rpm");
- RPM.addPass(&TPass1);
- RPM.addPass(&TPass2);
+ RPM.addPass(std::make_unique<TestPass1>(InstCount1));
+ RPM.addPass(std::make_unique<TestPass2>(InstCount2));
// Check runOnRegion().
llvm::SmallVector<std::unique_ptr<Region>> Regions =
Region::createRegionsFromMD(*F);
@@ -260,62 +256,60 @@ define i8 @foo(i8 %v0, i8 %v1) {
#endif // NDEBUG
}
-TEST_F(PassTest, PassRegistry) {
- class TestPass1 final : public FunctionPass {
- public:
- TestPass1() : FunctionPass("test-pass1") {}
- bool runOnFunction(Function &F) final { return false; }
- };
- class TestPass2 final : public FunctionPass {
- public:
- TestPass2() : FunctionPass("test-pass2") {}
- bool runOnFunction(Function &F) final { return false; }
- };
-
- PassRegistry Registry;
- auto &TP1 = Registry.registerPass(std::make_unique<TestPass1>());
- auto &TP2 = Registry.registerPass(std::make_unique<TestPass2>());
-
- // Check getPassByName().
- EXPECT_EQ(Registry.getPassByName("test-pass1"), &TP1);
- EXPECT_EQ(Registry.getPassByName("test-pass2"), &TP2);
-
-#ifndef NDEBUG
- // Check print().
- std::string Buff;
- llvm::raw_string_ostream SS(Buff);
- Registry.print(SS);
- EXPECT_EQ(Buff, "test-pass1\ntest-pass2\n");
-#endif // NDEBUG
+TEST_F(PassTest, SetPassPipeline) {
+ auto *F = parseFunction(R"IR(
+define void @f() {
+ ret void
}
+)IR",
+ "f");
+ class FooPass final : public FunctionPass {
+ std::string &Str;
-TEST_F(PassTest, ParsePassPipeline) {
- class TestPass1 final : public FunctionPass {
public:
- TestPass1() : FunctionPass("test-pass1") {}
- bool runOnFunction(Function &F) final { return false; }
+ FooPass(std::string &Str) : FunctionPass("foo-pass"), Str(Str) {}
+ bool runOnFunction(Function &F) final {
+ Str += "foo";
+ return false;
+ }
};
- class TestPass2 final : public FunctionPass {
+ class BarPass final : public FunctionPass {
+ std::string &Str;
+
public:
- TestPass2() : FunctionPass("test-pass2") {}
- bool runOnFunction(Function &F) final { return false; }
+ BarPass(std::string &Str) : FunctionPass("bar-pass"), Str(Str) {}
+ bool runOnFunction(Function &F) final {
+ Str += "bar";
+ return false;
+ }
};
- PassRegistry Registry;
- Registry.registerPass(std::make_unique<TestPass1>());
- Registry.registerPass(std::make_unique<TestPass2>());
+ std::string Str;
+ auto CreatePass =
+ [&Str](llvm::StringRef Name) -> std::unique_ptr<FunctionPass> {
+ if (Name == "foo")
+ return std::make_unique<FooPass>(Str);
+ if (Name == "bar")
+ return std::make_unique<BarPass>(Str);
+ return nullptr;
+ };
- [[maybe_unused]] auto &FPM =
- Registry.parseAndCreatePassPipeline("test-pass1,test-pass2,test-pass1");
+ FunctionPassManager FPM("test-fpm");
+ FPM.setPassPipeline("foo,bar,foo", CreatePass);
+ FPM.runOnFunction(*F);
+ EXPECT_EQ(Str, "foobarfoo");
+
+ // A second call to setPassPipeline will trigger an assertion in debug mode.
#ifndef NDEBUG
- std::string Buff;
- llvm::raw_string_ostream SS(Buff);
- FPM.print(SS);
- EXPECT_EQ(Buff, "init-fpm(test-pass1,test-pass2,test-pass1)");
-#endif // NDEBUG
+ EXPECT_DEATH(FPM.setPassPipeline("bar,bar,foo", CreatePass),
+ "setPassPipeline called on a non-empty sandboxir::PassManager");
+#endif
- EXPECT_DEATH(Registry.parseAndCreatePassPipeline("bad-pass-name"),
+ // Fresh PM for the death tests so they die from bad pipeline strings, rather
+ // than from multiple setPassPipeline calls.
+ FunctionPassManager FPM2("test-fpm");
+ EXPECT_DEATH(FPM2.setPassPipeline("bad-pass-name", CreatePass),
".*not registered.*");
- EXPECT_DEATH(Registry.parseAndCreatePassPipeline(""), ".*not registered.*");
- EXPECT_DEATH(Registry.parseAndCreatePassPipeline(","), ".*not registered.*");
+ EXPECT_DEATH(FPM2.setPassPipeline("", CreatePass), ".*not registered.*");
+ EXPECT_DEATH(FPM2.setPassPipeline(",", CreatePass), ".*not registered.*");
}