diff options
Diffstat (limited to 'llvm/unittests/Analysis/CGSCCPassManagerTest.cpp')
-rw-r--r-- | llvm/unittests/Analysis/CGSCCPassManagerTest.cpp | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/llvm/unittests/Analysis/CGSCCPassManagerTest.cpp b/llvm/unittests/Analysis/CGSCCPassManagerTest.cpp index 1532379..9fd782d 100644 --- a/llvm/unittests/Analysis/CGSCCPassManagerTest.cpp +++ b/llvm/unittests/Analysis/CGSCCPassManagerTest.cpp @@ -1878,6 +1878,61 @@ TEST_F(CGSCCPassManagerTest, TestInsertionOfNewFunctions2) { ASSERT_TRUE(Ran); } +TEST_F(CGSCCPassManagerTest, TestDeletionOfFunctionInNonTrivialRefSCC) { + std::unique_ptr<Module> M = parseIR("define void @f1() {\n" + "entry:\n" + " call void @f2()\n" + " ret void\n" + "}\n" + "define void @f2() {\n" + "entry:\n" + " call void @f1()\n" + " ret void\n" + "}\n"); + + bool Ran = false; + CGSCCPassManager CGPM; + CGPM.addPass(LambdaSCCPassNoPreserve( + [&](LazyCallGraph::SCC &C, CGSCCAnalysisManager &AM, LazyCallGraph &CG, + CGSCCUpdateResult &UR) { + if (Ran) + return; + + LazyCallGraph::Node *N1 = nullptr; + + for (LazyCallGraph::Node *N : SCCNodes(C)) { + Function &F = N->getFunction(); + if (F.getName() != "f1") + continue; + N1 = N; + + Function &F2 = *F.getParent()->getFunction("f2"); + + // Remove f1 <-> f2 references + F.getEntryBlock().front().eraseFromParent(); + F2.getEntryBlock().front().eraseFromParent(); + + CallGraphUpdater CGU; + CGU.initialize(CG, C, AM, UR); + CGU.removeFunction(F2); + CGU.reanalyzeFunction(F); + + Ran = true; + } + + // Check that updateCGAndAnalysisManagerForCGSCCPass() after + // CallGraphUpdater::removeFunction() succeeds. + updateCGAndAnalysisManagerForCGSCCPass(CG, *CG.lookupSCC(*N1), *N1, AM, + UR, FAM); + })); + + ModulePassManager MPM; + MPM.addPass(createModuleToPostOrderCGSCCPassAdaptor(std::move(CGPM))); + MPM.run(*M, MAM); + + ASSERT_TRUE(Ran); +} + TEST_F(CGSCCPassManagerTest, TestInsertionOfNewNonTrivialCallEdge) { std::unique_ptr<Module> M = parseIR("define void @f1() {\n" "entry:\n" |