Lines Matching +full:auto +full:- +full:switching
1 //===- CGSCCPassManager.cpp - Managing & running CGSCC passes -------------===//
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
42 "abort-on-max-devirt-iterations-reached",
79 AM.getCachedResult<FunctionAnalysisManagerCGSCCProxy>(*C)->getManager(); in run()
81 for (auto &Pass : Passes) { in run()
87 PreservedAnalyses PassPA = Pass->run(*C, AM, G, UR); in run()
93 auto *ResultFAMCP = in run()
95 ResultFAMCP->updateFAM(FAM); in run()
111 assert(C->begin() != C->end() && "Cannot have an empty SCC!"); in run()
121 // this with the cross-SCC preserved analysis set. This is used to allow in run()
146 AM.getCachedResult<FunctionAnalysisManagerModuleProxy>(M)->getManager(); in run()
207 // Push the initial SCCs in reverse post-order as we'll pop off the in run()
208 // back and so see this in post-order. in run()
229 // modules with a huge RefSCC. If a non-trivial amount of SCCs in the in run()
246 // cross-SCC preserved set. This preserved set is intersected by any in run()
257 // pass-manager driven invalidation scheme. in run()
263 assert(C->begin() != C->end() && "Cannot have an empty SCC!"); in run()
274 PreservedAnalyses PassPA = Pass->run(*C, CGAM, CG, UR); in run()
286 // Intersect with the cross-SCC preserved set to capture any in run()
287 // cross-SCC invalidation. in run()
302 assert(C->begin() != C->end() && "Cannot have an empty SCC!"); in run()
317 // refined, re-run the SCC pass over the newly refined SCC in order in run()
325 << "Re-running SCC passes after a refinement of the " in run()
344 DeadF->eraseFromParent(); in run()
381 auto ScanSCC = [](LazyCallGraph::SCC &C, in run()
390 .first->second; in run()
392 if (auto *CB = dyn_cast<CallBase>(&I)) { in run()
393 if (CB->getCalledFunction()) { in run()
407 auto CallCounts = ScanSCC(*C, UR.IndirectVHs); in run()
413 PreservedAnalyses PassPA = Pass->run(*C, AM, CG, UR); in run()
436 assert(C->begin() != C->end() && "Cannot have an empty SCC!"); in run()
439 bool Devirt = llvm::any_of(UR.IndirectVHs, [](auto &P) -> bool { in run()
442 if (CB->getCalledFunction()) { in run()
455 auto NewCallCounts = ScanSCC(*C, UR.IndirectVHs); in run()
465 for (auto &Pair : NewCallCounts) { in run()
466 auto &CallCountNew = Pair.second; in run()
467 auto CountIt = CallCounts.find(Pair.first); in run()
469 const auto &CallCountOld = CountIt->second; in run()
534 Function &F = N->getFunction(); in run()
543 PreservedAnalyses PassPA = Pass->run(F, FAM); in run()
559 auto PAC = PA.getChecker<LazyCallGraphAnalysis>(); in run()
593 // it to handle module -> function analysis invalidation in the face of in invalidate()
596 auto PAC = PA.getChecker<CGSCCAnalysisManagerModuleProxy>(); in invalidate()
600 InnerAM->clear(); in invalidate()
614 G->buildRefSCCs(); in invalidate()
615 for (auto &RC : G->postorder_ref_sccs()) in invalidate()
616 for (auto &C : RC) { in invalidate()
620 // module-level analysis invalidation triggering deferred invalidation in invalidate()
622 if (auto *OuterProxy = in invalidate()
623 InnerAM->getCachedResult<ModuleAnalysisManagerCGSCCProxy>(C)) in invalidate()
624 for (const auto &OuterInvalidationPair : in invalidate()
625 OuterProxy->getOuterInvalidations()) { in invalidate()
627 const auto &InnerAnalysisIDs = OuterInvalidationPair.second; in invalidate()
632 InnerPA->abandon(InnerAnalysisID); in invalidate()
639 InnerAM->invalidate(C, *InnerPA); in invalidate()
646 InnerAM->invalidate(C, PA); in invalidate()
674 auto &MAMProxy = AM.getResult<ModuleAnalysisManagerCGSCCProxy>(C, CG); in run()
675 Module &M = *C.begin()->getFunction().getParent(); in run()
701 // Specifically, any FAM-cached results for those functions need to have been in invalidate()
704 auto PAC = PA.getChecker<FunctionAnalysisManagerCGSCCProxy>(); in invalidate()
707 FAM->invalidate(N.getFunction(), PA); in invalidate()
723 // SCC-level analysis invalidation that triggers deferred invalidation in invalidate()
725 if (auto *OuterProxy = in invalidate()
726 FAM->getCachedResult<CGSCCAnalysisManagerFunctionProxy>(F)) in invalidate()
727 for (const auto &OuterInvalidationPair : in invalidate()
728 OuterProxy->getOuterInvalidations()) { in invalidate()
730 const auto &InnerAnalysisIDs = OuterInvalidationPair.second; in invalidate()
735 FunctionPA->abandon(InnerAnalysisID); in invalidate()
742 FAM->invalidate(F, *FunctionPA); in invalidate()
749 FAM->invalidate(F, PA); in invalidate()
782 auto *OuterProxy = in updateNewSCCFunctionAnalyses()
790 auto PA = PreservedAnalyses::all(); in updateNewSCCFunctionAnalyses()
791 for (const auto &OuterInvalidationPair : in updateNewSCCFunctionAnalyses()
792 OuterProxy->getOuterInvalidations()) { in updateNewSCCFunctionAnalyses()
793 const auto &InnerAnalysisIDs = OuterInvalidationPair.second; in updateNewSCCFunctionAnalyses()
840 if (auto *FAMProxy = in incorporateNewSCCRange()
842 FAM = &FAMProxy->getManager(); in incorporateNewSCCRange()
848 // split-off SCCs. in incorporateNewSCCRange()
851 auto PA = PreservedAnalyses::allInSet<AllAnalysesOn<Function>>(); in incorporateNewSCCRange()
855 // Ensure the now-current SCC's function analyses are updated. in incorporateNewSCCRange()
860 assert(C != &NewC && "No need to re-visit the current SCC!"); in incorporateNewSCCRange()
904 if (auto *CB = dyn_cast<CallBase>(&I)) { in updateCGAndAnalysisManagerForPass()
905 if (Function *Callee = CB->getCalledFunction()) { in updateCGAndAnalysisManagerForPass()
906 if (Visited.insert(Callee).second && !Callee->isDeclaration()) { in updateCGAndAnalysisManagerForPass()
910 Edge *E = N->lookup(*CalleeN); in updateCGAndAnalysisManagerForPass()
920 else if (!E->isCall()) in updateCGAndAnalysisManagerForPass()
926 auto *Entry = UR.IndirectVHs.find(CB); in updateCGAndAnalysisManagerForPass()
929 else if (!Entry->second) in updateCGAndAnalysisManagerForPass()
930 Entry->second = WeakTrackingVH(CB); in updateCGAndAnalysisManagerForPass()
938 if (auto *OpC = dyn_cast<Constant>(Op)) in updateCGAndAnalysisManagerForPass()
942 auto VisitRef = [&](Function &Referee) { in updateCGAndAnalysisManagerForPass()
946 Edge *E = N->lookup(*RefereeN); in updateCGAndAnalysisManagerForPass()
956 else if (E->isCall()) in updateCGAndAnalysisManagerForPass()
969 RC->isAncestorOf(TargetRC)) && "New ref edge is not trivial!"); in updateCGAndAnalysisManagerForPass()
971 RC->insertTrivialRefEdge(N, *RefTarget); in updateCGAndAnalysisManagerForPass()
982 RC->isAncestorOf(TargetRC)) && "New call edge is not trivial!"); in updateCGAndAnalysisManagerForPass()
986 RC->insertTrivialRefEdge(N, *CallTarget); in updateCGAndAnalysisManagerForPass()
990 for (auto *LibFn : G.getLibFunctions()) in updateCGAndAnalysisManagerForPass()
991 // While the list of lib functions doesn't have repeats, don't re-visit in updateCGAndAnalysisManagerForPass()
1009 RC->switchTrivialInternalEdgeToRef(N, E.getNode()); in updateCGAndAnalysisManagerForPass()
1012 C = incorporateNewSCCRange(RC->switchInternalEdgeToRef(N, E.getNode()), in updateCGAndAnalysisManagerForPass()
1032 RC->removeOutgoingEdge(N, *TargetN); in updateCGAndAnalysisManagerForPass()
1047 assert(RC->isAncestorOf(TargetRC) && in updateCGAndAnalysisManagerForPass()
1050 RC->switchOutgoingEdgeToRef(N, *RefTarget); in updateCGAndAnalysisManagerForPass()
1056 // We are switching an internal call edge to a ref edge. This may split up in updateCGAndAnalysisManagerForPass()
1060 RC->switchTrivialInternalEdgeToRef(N, *RefTarget); in updateCGAndAnalysisManagerForPass()
1065 C = incorporateNewSCCRange(RC->switchInternalEdgeToRef(N, *RefTarget), G, N, in updateCGAndAnalysisManagerForPass()
1083 assert(RC->isAncestorOf(TargetRC) && in updateCGAndAnalysisManagerForPass()
1086 RC->switchOutgoingEdgeToCall(N, *CallTarget); in updateCGAndAnalysisManagerForPass()
1094 // Otherwise we are switching an internal ref edge to a call edge. This in updateCGAndAnalysisManagerForPass()
1097 // before the current one in the post-order sequence in updateCGAndAnalysisManagerForPass()
1099 auto InitialSCCIndex = RC->find(*C) - RC->begin(); in updateCGAndAnalysisManagerForPass()
1100 bool FormedCycle = RC->switchInternalEdgeToCall( in updateCGAndAnalysisManagerForPass()
1115 auto PA = PreservedAnalyses::allInSet<AllAnalysesOn<Function>>(); in updateCGAndAnalysisManagerForPass()
1136 auto PA = PreservedAnalyses::allInSet<AllAnalysesOn<Function>>(); in updateCGAndAnalysisManagerForPass()
1140 auto NewSCCIndex = RC->find(*C) - RC->begin(); in updateCGAndAnalysisManagerForPass()
1152 // post-order sequence, and may end up observing more precise context to in updateCGAndAnalysisManagerForPass()
1158 for (SCC &MovedC : llvm::reverse(make_range(RC->begin() + InitialSCCIndex, in updateCGAndAnalysisManagerForPass()
1159 RC->begin() + NewSCCIndex))) { in updateCGAndAnalysisManagerForPass()
1161 LLVM_DEBUG(dbgs() << "Enqueuing a newly earlier in post-order SCC: " in updateCGAndAnalysisManagerForPass()
1168 assert(&C->getOuterRefSCC() == RC && "Current SCC not in current RefSCC!"); in updateCGAndAnalysisManagerForPass()