diff options
Diffstat (limited to 'llvm/unittests/SandboxIR/PassTest.cpp')
| -rw-r--r-- | llvm/unittests/SandboxIR/PassTest.cpp | 104 |
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.*"); } |
