Please use GitHub pull requests for new patches. Phabricator shutdown timeline
Changeset View
Changeset View
Standalone View
Standalone View
llvm/unittests/IR/PassManagerTest.cpp
Show First 20 Lines • Show All 818 Lines • ▼ Show 20 Lines | auto M = parseIR(Context, "define void @foo() {\n" | ||||
"next:\n" | "next:\n" | ||||
" br label %exit\n" | " br label %exit\n" | ||||
"exit:\n" | "exit:\n" | ||||
" ret void\n" | " ret void\n" | ||||
"}\n"); | "}\n"); | ||||
auto *F = M->getFunction("foo"); | auto *F = M->getFunction("foo"); | ||||
FunctionAnalysisManager FAM; | FunctionAnalysisManager FAM; | ||||
ModuleAnalysisManager MAM; | |||||
FunctionPassManager FPM; | FunctionPassManager FPM; | ||||
PassInstrumentationCallbacks PIC; | PassInstrumentationCallbacks PIC; | ||||
StandardInstrumentations SI(M->getContext(), /*DebugLogging*/ true); | 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 PassInstrumentationAnalysis(&PIC); }); | ||||
FAM.registerPass([&] { return DominatorTreeAnalysis(); }); | FAM.registerPass([&] { return DominatorTreeAnalysis(); }); | ||||
FAM.registerPass([&] { return AssumptionAnalysis(); }); | FAM.registerPass([&] { return AssumptionAnalysis(); }); | ||||
FAM.registerPass([&] { return TargetIRAnalysis(); }); | FAM.registerPass([&] { return TargetIRAnalysis(); }); | ||||
FPM.addPass(SimplifyCFGPass()); | FPM.addPass(SimplifyCFGPass()); | ||||
FPM.run(*F, FAM); | FPM.run(*F, FAM); | ||||
} | } | ||||
Show All 26 Lines | auto M = parseIR(Context, "define void @foo() {\n" | ||||
"next:\n" | "next:\n" | ||||
" br label %exit\n" | " br label %exit\n" | ||||
"exit:\n" | "exit:\n" | ||||
" ret void\n" | " ret void\n" | ||||
"}\n"); | "}\n"); | ||||
auto *F = M->getFunction("foo"); | auto *F = M->getFunction("foo"); | ||||
FunctionAnalysisManager FAM; | FunctionAnalysisManager FAM; | ||||
ModuleAnalysisManager MAM; | |||||
FunctionPassManager FPM; | FunctionPassManager FPM; | ||||
PassInstrumentationCallbacks PIC; | PassInstrumentationCallbacks PIC; | ||||
StandardInstrumentations SI(M->getContext(), /*DebugLogging*/ true); | 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 PassInstrumentationAnalysis(&PIC); }); | ||||
FAM.registerPass([&] { return DominatorTreeAnalysis(); }); | FAM.registerPass([&] { return DominatorTreeAnalysis(); }); | ||||
FAM.registerPass([&] { return AssumptionAnalysis(); }); | FAM.registerPass([&] { return AssumptionAnalysis(); }); | ||||
FAM.registerPass([&] { return TargetIRAnalysis(); }); | FAM.registerPass([&] { return TargetIRAnalysis(); }); | ||||
FPM.addPass(TestSimplifyCFGInvalidatingAnalysisPass()); | FPM.addPass(TestSimplifyCFGInvalidatingAnalysisPass()); | ||||
FPM.run(*F, FAM); | FPM.run(*F, FAM); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 45 Lines • ▼ Show 20 Lines | auto M = parseIR(Context, "define void @foo() {\n" | ||||
"next:\n" | "next:\n" | ||||
" br label %exit\n" | " br label %exit\n" | ||||
"exit:\n" | "exit:\n" | ||||
" ret void\n" | " ret void\n" | ||||
"}\n"); | "}\n"); | ||||
auto *F = M->getFunction("foo"); | auto *F = M->getFunction("foo"); | ||||
FunctionAnalysisManager FAM; | FunctionAnalysisManager FAM; | ||||
ModuleAnalysisManager MAM; | |||||
FunctionPassManager FPM; | FunctionPassManager FPM; | ||||
PassInstrumentationCallbacks PIC; | PassInstrumentationCallbacks PIC; | ||||
StandardInstrumentations SI(M->getContext(), /*DebugLogging*/ true); | 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 PassInstrumentationAnalysis(&PIC); }); | ||||
FAM.registerPass([&] { return DominatorTreeAnalysis(); }); | FAM.registerPass([&] { return DominatorTreeAnalysis(); }); | ||||
FAM.registerPass([&] { return AssumptionAnalysis(); }); | FAM.registerPass([&] { return AssumptionAnalysis(); }); | ||||
FAM.registerPass([&] { return TargetIRAnalysis(); }); | FAM.registerPass([&] { return TargetIRAnalysis(); }); | ||||
FunctionPassManager InnerFPM; | FunctionPassManager InnerFPM; | ||||
InnerFPM.addPass(SimplifyCFGPass()); | InnerFPM.addPass(SimplifyCFGPass()); | ||||
FPM.addPass(TestSimplifyCFGWrapperPass(InnerFPM)); | FPM.addPass(TestSimplifyCFGWrapperPass(InnerFPM)); | ||||
FPM.run(*F, FAM); | FPM.run(*F, FAM); | ||||
} | } | ||||
#ifdef EXPENSIVE_CHECKS | #ifdef EXPENSIVE_CHECKS | ||||
struct WrongFunctionPass : PassInfoMixin<WrongFunctionPass> { | struct WrongFunctionPass : PassInfoMixin<WrongFunctionPass> { | ||||
PreservedAnalyses run(Function &F, FunctionAnalysisManager &FAM) { | PreservedAnalyses run(Function &F, FunctionAnalysisManager &FAM) { | ||||
F.getEntryBlock().begin()->eraseFromParent(); | F.getEntryBlock().begin()->eraseFromParent(); | ||||
return PreservedAnalyses::all(); | return PreservedAnalyses::all(); | ||||
} | } | ||||
static StringRef name() { return "WrongFunctionPass"; } | static StringRef name() { return "WrongFunctionPass"; } | ||||
}; | }; | ||||
TEST_F(PassManagerTest, FunctionAnalysisMissedInvalidation) { | TEST_F(PassManagerTest, FunctionPassMissedFunctionAnalysisInvalidation) { | ||||
LLVMContext Context; | LLVMContext Context; | ||||
auto M = parseIR(Context, "define void @foo() {\n" | auto M = parseIR(Context, "define void @foo() {\n" | ||||
" %a = add i32 0, 0\n" | " %a = add i32 0, 0\n" | ||||
" ret void\n" | " ret void\n" | ||||
"}\n"); | "}\n"); | ||||
FunctionAnalysisManager FAM; | FunctionAnalysisManager FAM; | ||||
ModuleAnalysisManager MAM; | |||||
PassInstrumentationCallbacks PIC; | PassInstrumentationCallbacks PIC; | ||||
StandardInstrumentations SI(M->getContext(), /*DebugLogging*/ false); | 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); }); | FAM.registerPass([&] { return PassInstrumentationAnalysis(&PIC); }); | ||||
FunctionPassManager FPM; | FunctionPassManager FPM; | ||||
FPM.addPass(WrongFunctionPass()); | FPM.addPass(WrongFunctionPass()); | ||||
auto *F = M->getFunction("foo"); | auto *F = M->getFunction("foo"); | ||||
EXPECT_DEATH(FPM.run(*F, FAM), "Function @foo changed by WrongFunctionPass without invalidating analyses"); | 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 | |||||
} | } |