diff options
author | Arthur Eubanks <aeubanks@google.com> | 2023-03-15 11:46:44 -0700 |
---|---|---|
committer | Arthur Eubanks <aeubanks@google.com> | 2023-03-15 13:29:21 -0700 |
commit | 6a6994cc9bc0327aaf8b005c650ff5eb29d2bcce (patch) | |
tree | 1c4d394cca6b646def8388dce9627364f8739a91 /llvm/unittests/IR/PassManagerTest.cpp | |
parent | 04d20195d6b3747a3cdc882105320b32cb192b8a (diff) | |
download | llvm-6a6994cc9bc0327aaf8b005c650ff5eb29d2bcce.zip llvm-6a6994cc9bc0327aaf8b005c650ff5eb29d2bcce.tar.gz llvm-6a6994cc9bc0327aaf8b005c650ff5eb29d2bcce.tar.bz2 |
Reland [StandardInstrumentations] Check function analysis invalidation in module passes as well
See comments for why we now need to pass in the MAM instead of the FAM.
Reviewed By: nikic
Differential Revision: https://reviews.llvm.org/D146160
Diffstat (limited to 'llvm/unittests/IR/PassManagerTest.cpp')
-rw-r--r-- | llvm/unittests/IR/PassManagerTest.cpp | 57 |
1 files changed, 51 insertions, 6 deletions
diff --git a/llvm/unittests/IR/PassManagerTest.cpp b/llvm/unittests/IR/PassManagerTest.cpp index 4c8be37..dda1d0c 100644 --- a/llvm/unittests/IR/PassManagerTest.cpp +++ b/llvm/unittests/IR/PassManagerTest.cpp @@ -824,10 +824,13 @@ TEST_F(PassManagerTest, FunctionPassCFGChecker) { auto *F = M->getFunction("foo"); FunctionAnalysisManager FAM; + ModuleAnalysisManager MAM; FunctionPassManager FPM; PassInstrumentationCallbacks PIC; StandardInstrumentations SI(M->getContext(), /*DebugLogging*/ true); - SI.registerCallbacks(PIC, &FAM); + SI.registerCallbacks(PIC, &MAM); + MAM.registerPass([&] { return PassInstrumentationAnalysis(&PIC); }); + MAM.registerPass([&] { return FunctionAnalysisManagerModuleProxy(FAM); }); FAM.registerPass([&] { return PassInstrumentationAnalysis(&PIC); }); FAM.registerPass([&] { return DominatorTreeAnalysis(); }); FAM.registerPass([&] { return AssumptionAnalysis(); }); @@ -870,10 +873,13 @@ TEST_F(PassManagerTest, FunctionPassCFGCheckerInvalidateAnalysis) { auto *F = M->getFunction("foo"); FunctionAnalysisManager FAM; + ModuleAnalysisManager MAM; FunctionPassManager FPM; PassInstrumentationCallbacks PIC; StandardInstrumentations SI(M->getContext(), /*DebugLogging*/ true); - SI.registerCallbacks(PIC, &FAM); + SI.registerCallbacks(PIC, &MAM); + MAM.registerPass([&] { return FunctionAnalysisManagerModuleProxy(FAM); }); + MAM.registerPass([&] { return PassInstrumentationAnalysis(&PIC); }); FAM.registerPass([&] { return PassInstrumentationAnalysis(&PIC); }); FAM.registerPass([&] { return DominatorTreeAnalysis(); }); FAM.registerPass([&] { return AssumptionAnalysis(); }); @@ -935,10 +941,13 @@ TEST_F(PassManagerTest, FunctionPassCFGCheckerWrapped) { auto *F = M->getFunction("foo"); FunctionAnalysisManager FAM; + ModuleAnalysisManager MAM; FunctionPassManager FPM; PassInstrumentationCallbacks PIC; StandardInstrumentations SI(M->getContext(), /*DebugLogging*/ true); - SI.registerCallbacks(PIC, &FAM); + SI.registerCallbacks(PIC, &MAM); + MAM.registerPass([&] { return FunctionAnalysisManagerModuleProxy(FAM); }); + MAM.registerPass([&] { return PassInstrumentationAnalysis(&PIC); }); FAM.registerPass([&] { return PassInstrumentationAnalysis(&PIC); }); FAM.registerPass([&] { return DominatorTreeAnalysis(); }); FAM.registerPass([&] { return AssumptionAnalysis(); }); @@ -961,7 +970,7 @@ struct WrongFunctionPass : PassInfoMixin<WrongFunctionPass> { static StringRef name() { return "WrongFunctionPass"; } }; -TEST_F(PassManagerTest, FunctionAnalysisMissedInvalidation) { +TEST_F(PassManagerTest, FunctionPassMissedFunctionAnalysisInvalidation) { LLVMContext Context; auto M = parseIR(Context, "define void @foo() {\n" " %a = add i32 0, 0\n" @@ -969,9 +978,12 @@ TEST_F(PassManagerTest, FunctionAnalysisMissedInvalidation) { "}\n"); FunctionAnalysisManager FAM; + ModuleAnalysisManager MAM; PassInstrumentationCallbacks PIC; StandardInstrumentations SI(M->getContext(), /*DebugLogging*/ false); - SI.registerCallbacks(PIC, &FAM); + SI.registerCallbacks(PIC, &MAM); + MAM.registerPass([&] { return FunctionAnalysisManagerModuleProxy(FAM); }); + MAM.registerPass([&] { return PassInstrumentationAnalysis(&PIC); }); FAM.registerPass([&] { return PassInstrumentationAnalysis(&PIC); }); FunctionPassManager FPM; @@ -981,6 +993,39 @@ TEST_F(PassManagerTest, FunctionAnalysisMissedInvalidation) { EXPECT_DEATH(FPM.run(*F, FAM), "Function @foo changed by WrongFunctionPass without invalidating analyses"); } -#endif +struct WrongModulePass : PassInfoMixin<WrongModulePass> { + PreservedAnalyses run(Module &M, ModuleAnalysisManager &MAM) { + for (Function &F : M) + F.getEntryBlock().begin()->eraseFromParent(); + + return PreservedAnalyses::all(); + } + static StringRef name() { return "WrongModulePass"; } +}; + +TEST_F(PassManagerTest, ModulePassMissedFunctionAnalysisInvalidation) { + LLVMContext Context; + auto M = parseIR(Context, "define void @foo() {\n" + " %a = add i32 0, 0\n" + " ret void\n" + "}\n"); + + FunctionAnalysisManager FAM; + ModuleAnalysisManager MAM; + PassInstrumentationCallbacks PIC; + StandardInstrumentations SI(M->getContext(), /*DebugLogging*/ false); + SI.registerCallbacks(PIC, &MAM); + MAM.registerPass([&] { return FunctionAnalysisManagerModuleProxy(FAM); }); + MAM.registerPass([&] { return PassInstrumentationAnalysis(&PIC); }); + FAM.registerPass([&] { return PassInstrumentationAnalysis(&PIC); }); + ModulePassManager MPM; + MPM.addPass(WrongModulePass()); + + EXPECT_DEATH( + MPM.run(*M, MAM), + "Function @foo changed by WrongModulePass without invalidating analyses"); +} + +#endif } |