16cad45d5SLiqiang Tao //===- ModuleInliner.cpp - Code related to module inliner -----------------===// 26cad45d5SLiqiang Tao // 36cad45d5SLiqiang Tao // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 46cad45d5SLiqiang Tao // See https://llvm.org/LICENSE.txt for license information. 56cad45d5SLiqiang Tao // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 66cad45d5SLiqiang Tao // 76cad45d5SLiqiang Tao //===----------------------------------------------------------------------===// 86cad45d5SLiqiang Tao // 96cad45d5SLiqiang Tao // This file implements the mechanics required to implement inlining without 106cad45d5SLiqiang Tao // missing any calls in the module level. It doesn't need any infromation about 116cad45d5SLiqiang Tao // SCC or call graph, which is different from the SCC inliner. The decisions of 126cad45d5SLiqiang Tao // which calls are profitable to inline are implemented elsewhere. 136cad45d5SLiqiang Tao // 146cad45d5SLiqiang Tao //===----------------------------------------------------------------------===// 156cad45d5SLiqiang Tao 166cad45d5SLiqiang Tao #include "llvm/Transforms/IPO/ModuleInliner.h" 176cad45d5SLiqiang Tao #include "llvm/ADT/ScopeExit.h" 186cad45d5SLiqiang Tao #include "llvm/ADT/SetVector.h" 196cad45d5SLiqiang Tao #include "llvm/ADT/SmallVector.h" 206cad45d5SLiqiang Tao #include "llvm/ADT/Statistic.h" 21*f1985a3fSserge-sans-paille #include "llvm/Analysis/AliasAnalysis.h" 226cad45d5SLiqiang Tao #include "llvm/Analysis/AssumptionCache.h" 236cad45d5SLiqiang Tao #include "llvm/Analysis/BlockFrequencyInfo.h" 246cad45d5SLiqiang Tao #include "llvm/Analysis/InlineAdvisor.h" 256cad45d5SLiqiang Tao #include "llvm/Analysis/InlineCost.h" 266cad45d5SLiqiang Tao #include "llvm/Analysis/InlineOrder.h" 276cad45d5SLiqiang Tao #include "llvm/Analysis/OptimizationRemarkEmitter.h" 286cad45d5SLiqiang Tao #include "llvm/Analysis/ProfileSummaryInfo.h" 29*f1985a3fSserge-sans-paille #include "llvm/Analysis/ReplayInlineAdvisor.h" 306cad45d5SLiqiang Tao #include "llvm/Analysis/TargetLibraryInfo.h" 316cad45d5SLiqiang Tao #include "llvm/IR/DiagnosticInfo.h" 326cad45d5SLiqiang Tao #include "llvm/IR/Function.h" 336cad45d5SLiqiang Tao #include "llvm/IR/InstIterator.h" 346cad45d5SLiqiang Tao #include "llvm/IR/Instruction.h" 356cad45d5SLiqiang Tao #include "llvm/IR/IntrinsicInst.h" 366cad45d5SLiqiang Tao #include "llvm/IR/Module.h" 376cad45d5SLiqiang Tao #include "llvm/IR/PassManager.h" 386cad45d5SLiqiang Tao #include "llvm/Support/CommandLine.h" 396cad45d5SLiqiang Tao #include "llvm/Support/Debug.h" 406cad45d5SLiqiang Tao #include "llvm/Support/raw_ostream.h" 416cad45d5SLiqiang Tao #include "llvm/Transforms/Utils/CallPromotionUtils.h" 426cad45d5SLiqiang Tao #include "llvm/Transforms/Utils/Cloning.h" 436cad45d5SLiqiang Tao #include <cassert> 446cad45d5SLiqiang Tao 456cad45d5SLiqiang Tao using namespace llvm; 466cad45d5SLiqiang Tao 476cad45d5SLiqiang Tao #define DEBUG_TYPE "module-inline" 486cad45d5SLiqiang Tao 496cad45d5SLiqiang Tao STATISTIC(NumInlined, "Number of functions inlined"); 506cad45d5SLiqiang Tao STATISTIC(NumDeleted, "Number of functions deleted because all callers found"); 516cad45d5SLiqiang Tao 526cad45d5SLiqiang Tao static cl::opt<bool> InlineEnablePriorityOrder( 536cad45d5SLiqiang Tao "module-inline-enable-priority-order", cl::Hidden, cl::init(true), 546cad45d5SLiqiang Tao cl::desc("Enable the priority inline order for the module inliner")); 556cad45d5SLiqiang Tao 566cad45d5SLiqiang Tao /// Return true if the specified inline history ID 576cad45d5SLiqiang Tao /// indicates an inline history that includes the specified function. 586cad45d5SLiqiang Tao static bool inlineHistoryIncludes( 596cad45d5SLiqiang Tao Function *F, int InlineHistoryID, 606cad45d5SLiqiang Tao const SmallVectorImpl<std::pair<Function *, int>> &InlineHistory) { 616cad45d5SLiqiang Tao while (InlineHistoryID != -1) { 626cad45d5SLiqiang Tao assert(unsigned(InlineHistoryID) < InlineHistory.size() && 636cad45d5SLiqiang Tao "Invalid inline history ID"); 646cad45d5SLiqiang Tao if (InlineHistory[InlineHistoryID].first == F) 656cad45d5SLiqiang Tao return true; 666cad45d5SLiqiang Tao InlineHistoryID = InlineHistory[InlineHistoryID].second; 676cad45d5SLiqiang Tao } 686cad45d5SLiqiang Tao return false; 696cad45d5SLiqiang Tao } 706cad45d5SLiqiang Tao 716cad45d5SLiqiang Tao InlineAdvisor &ModuleInlinerPass::getAdvisor(const ModuleAnalysisManager &MAM, 726cad45d5SLiqiang Tao FunctionAnalysisManager &FAM, 736cad45d5SLiqiang Tao Module &M) { 746cad45d5SLiqiang Tao if (OwnedAdvisor) 756cad45d5SLiqiang Tao return *OwnedAdvisor; 766cad45d5SLiqiang Tao 776cad45d5SLiqiang Tao auto *IAA = MAM.getCachedResult<InlineAdvisorAnalysis>(M); 786cad45d5SLiqiang Tao if (!IAA) { 796cad45d5SLiqiang Tao // It should still be possible to run the inliner as a stand-alone module 806cad45d5SLiqiang Tao // pass, for test scenarios. In that case, we default to the 816cad45d5SLiqiang Tao // DefaultInlineAdvisor, which doesn't need to keep state between module 826cad45d5SLiqiang Tao // pass runs. It also uses just the default InlineParams. In this case, we 836cad45d5SLiqiang Tao // need to use the provided FAM, which is valid for the duration of the 846cad45d5SLiqiang Tao // inliner pass, and thus the lifetime of the owned advisor. The one we 856cad45d5SLiqiang Tao // would get from the MAM can be invalidated as a result of the inliner's 866cad45d5SLiqiang Tao // activity. 876cad45d5SLiqiang Tao OwnedAdvisor = std::make_unique<DefaultInlineAdvisor>(M, FAM, Params); 886cad45d5SLiqiang Tao 896cad45d5SLiqiang Tao return *OwnedAdvisor; 906cad45d5SLiqiang Tao } 916cad45d5SLiqiang Tao assert(IAA->getAdvisor() && 926cad45d5SLiqiang Tao "Expected a present InlineAdvisorAnalysis also have an " 936cad45d5SLiqiang Tao "InlineAdvisor initialized"); 946cad45d5SLiqiang Tao return *IAA->getAdvisor(); 956cad45d5SLiqiang Tao } 966cad45d5SLiqiang Tao 976cad45d5SLiqiang Tao static bool isKnownLibFunction(Function &F, TargetLibraryInfo &TLI) { 986cad45d5SLiqiang Tao LibFunc LF; 996cad45d5SLiqiang Tao 1006cad45d5SLiqiang Tao // Either this is a normal library function or a "vectorizable" 1016cad45d5SLiqiang Tao // function. Not using the VFDatabase here because this query 1026cad45d5SLiqiang Tao // is related only to libraries handled via the TLI. 1036cad45d5SLiqiang Tao return TLI.getLibFunc(F, LF) || 1046cad45d5SLiqiang Tao TLI.isKnownVectorFunctionInLibrary(F.getName()); 1056cad45d5SLiqiang Tao } 1066cad45d5SLiqiang Tao 1076cad45d5SLiqiang Tao PreservedAnalyses ModuleInlinerPass::run(Module &M, 1086cad45d5SLiqiang Tao ModuleAnalysisManager &MAM) { 1096cad45d5SLiqiang Tao LLVM_DEBUG(dbgs() << "---- Module Inliner is Running ---- \n"); 1106cad45d5SLiqiang Tao 1116cad45d5SLiqiang Tao auto &IAA = MAM.getResult<InlineAdvisorAnalysis>(M); 1126cad45d5SLiqiang Tao if (!IAA.tryCreate(Params, Mode, {})) { 1136cad45d5SLiqiang Tao M.getContext().emitError( 1146cad45d5SLiqiang Tao "Could not setup Inlining Advisor for the requested " 1156cad45d5SLiqiang Tao "mode and/or options"); 1166cad45d5SLiqiang Tao return PreservedAnalyses::all(); 1176cad45d5SLiqiang Tao } 1186cad45d5SLiqiang Tao 1196cad45d5SLiqiang Tao bool Changed = false; 1206cad45d5SLiqiang Tao 1216cad45d5SLiqiang Tao ProfileSummaryInfo *PSI = MAM.getCachedResult<ProfileSummaryAnalysis>(M); 1226cad45d5SLiqiang Tao 1236cad45d5SLiqiang Tao FunctionAnalysisManager &FAM = 1246cad45d5SLiqiang Tao MAM.getResult<FunctionAnalysisManagerModuleProxy>(M).getManager(); 1256cad45d5SLiqiang Tao 1266cad45d5SLiqiang Tao auto GetTLI = [&FAM](Function &F) -> TargetLibraryInfo & { 1276cad45d5SLiqiang Tao return FAM.getResult<TargetLibraryAnalysis>(F); 1286cad45d5SLiqiang Tao }; 1296cad45d5SLiqiang Tao 1306cad45d5SLiqiang Tao InlineAdvisor &Advisor = getAdvisor(MAM, FAM, M); 1316cad45d5SLiqiang Tao Advisor.onPassEntry(); 1326cad45d5SLiqiang Tao 1336cad45d5SLiqiang Tao auto AdvisorOnExit = make_scope_exit([&] { Advisor.onPassExit(); }); 1346cad45d5SLiqiang Tao 1356cad45d5SLiqiang Tao // In the module inliner, a priority-based worklist is used for calls across 1366cad45d5SLiqiang Tao // the entire Module. With this module inliner, the inline order is not 1376cad45d5SLiqiang Tao // limited to bottom-up order. More globally scope inline order is enabled. 1386cad45d5SLiqiang Tao // Also, the inline deferral logic become unnecessary in this module inliner. 1396cad45d5SLiqiang Tao // It is possible to use other priority heuristics, e.g. profile-based 1406cad45d5SLiqiang Tao // heuristic. 1416cad45d5SLiqiang Tao // 1426cad45d5SLiqiang Tao // TODO: Here is a huge amount duplicate code between the module inliner and 1436cad45d5SLiqiang Tao // the SCC inliner, which need some refactoring. 1446cad45d5SLiqiang Tao std::unique_ptr<InlineOrder<std::pair<CallBase *, int>>> Calls; 1456cad45d5SLiqiang Tao if (InlineEnablePriorityOrder) 1466cad45d5SLiqiang Tao Calls = std::make_unique<PriorityInlineOrder<InlineSizePriority>>(); 1476cad45d5SLiqiang Tao else 1486cad45d5SLiqiang Tao Calls = std::make_unique<DefaultInlineOrder<std::pair<CallBase *, int>>>(); 1496cad45d5SLiqiang Tao assert(Calls != nullptr && "Expected an initialized InlineOrder"); 1506cad45d5SLiqiang Tao 1516cad45d5SLiqiang Tao // Populate the initial list of calls in this module. 1526cad45d5SLiqiang Tao for (Function &F : M) { 1536cad45d5SLiqiang Tao auto &ORE = FAM.getResult<OptimizationRemarkEmitterAnalysis>(F); 1546cad45d5SLiqiang Tao // We want to generally process call sites top-down in order for 1556cad45d5SLiqiang Tao // simplifications stemming from replacing the call with the returned value 1566cad45d5SLiqiang Tao // after inlining to be visible to subsequent inlining decisions. 1576cad45d5SLiqiang Tao // FIXME: Using instructions sequence is a really bad way to do this. 1586cad45d5SLiqiang Tao // Instead we should do an actual RPO walk of the function body. 1596cad45d5SLiqiang Tao for (Instruction &I : instructions(F)) 1606cad45d5SLiqiang Tao if (auto *CB = dyn_cast<CallBase>(&I)) 1616cad45d5SLiqiang Tao if (Function *Callee = CB->getCalledFunction()) { 1626cad45d5SLiqiang Tao if (!Callee->isDeclaration()) 1636cad45d5SLiqiang Tao Calls->push({CB, -1}); 1646cad45d5SLiqiang Tao else if (!isa<IntrinsicInst>(I)) { 1656cad45d5SLiqiang Tao using namespace ore; 1666cad45d5SLiqiang Tao setInlineRemark(*CB, "unavailable definition"); 1676cad45d5SLiqiang Tao ORE.emit([&]() { 1686cad45d5SLiqiang Tao return OptimizationRemarkMissed(DEBUG_TYPE, "NoDefinition", &I) 1696cad45d5SLiqiang Tao << NV("Callee", Callee) << " will not be inlined into " 1706cad45d5SLiqiang Tao << NV("Caller", CB->getCaller()) 1716cad45d5SLiqiang Tao << " because its definition is unavailable" 1726cad45d5SLiqiang Tao << setIsVerbose(); 1736cad45d5SLiqiang Tao }); 1746cad45d5SLiqiang Tao } 1756cad45d5SLiqiang Tao } 1766cad45d5SLiqiang Tao } 1776cad45d5SLiqiang Tao if (Calls->empty()) 1786cad45d5SLiqiang Tao return PreservedAnalyses::all(); 1796cad45d5SLiqiang Tao 1806cad45d5SLiqiang Tao // When inlining a callee produces new call sites, we want to keep track of 1816cad45d5SLiqiang Tao // the fact that they were inlined from the callee. This allows us to avoid 1826cad45d5SLiqiang Tao // infinite inlining in some obscure cases. To represent this, we use an 1836cad45d5SLiqiang Tao // index into the InlineHistory vector. 1846cad45d5SLiqiang Tao SmallVector<std::pair<Function *, int>, 16> InlineHistory; 1856cad45d5SLiqiang Tao 1866cad45d5SLiqiang Tao // Track a set vector of inlined callees so that we can augment the caller 1876cad45d5SLiqiang Tao // with all of their edges in the call graph before pruning out the ones that 1886cad45d5SLiqiang Tao // got simplified away. 1896cad45d5SLiqiang Tao SmallSetVector<Function *, 4> InlinedCallees; 1906cad45d5SLiqiang Tao 1916cad45d5SLiqiang Tao // Track the dead functions to delete once finished with inlining calls. We 1926cad45d5SLiqiang Tao // defer deleting these to make it easier to handle the call graph updates. 1936cad45d5SLiqiang Tao SmallVector<Function *, 4> DeadFunctions; 1946cad45d5SLiqiang Tao 1956cad45d5SLiqiang Tao // Loop forward over all of the calls. 1966cad45d5SLiqiang Tao while (!Calls->empty()) { 1976cad45d5SLiqiang Tao // We expect the calls to typically be batched with sequences of calls that 1986cad45d5SLiqiang Tao // have the same caller, so we first set up some shared infrastructure for 1996cad45d5SLiqiang Tao // this caller. We also do any pruning we can at this layer on the caller 2006cad45d5SLiqiang Tao // alone. 2016cad45d5SLiqiang Tao Function &F = *Calls->front().first->getCaller(); 2026cad45d5SLiqiang Tao 2036cad45d5SLiqiang Tao LLVM_DEBUG(dbgs() << "Inlining calls in: " << F.getName() << "\n" 2046cad45d5SLiqiang Tao << " Function size: " << F.getInstructionCount() 2056cad45d5SLiqiang Tao << "\n"); 2066cad45d5SLiqiang Tao 2076cad45d5SLiqiang Tao auto GetAssumptionCache = [&](Function &F) -> AssumptionCache & { 2086cad45d5SLiqiang Tao return FAM.getResult<AssumptionAnalysis>(F); 2096cad45d5SLiqiang Tao }; 2106cad45d5SLiqiang Tao 2116cad45d5SLiqiang Tao // Now process as many calls as we have within this caller in the sequence. 2126cad45d5SLiqiang Tao // We bail out as soon as the caller has to change so we can 2136cad45d5SLiqiang Tao // prepare the context of that new caller. 2146cad45d5SLiqiang Tao bool DidInline = false; 2156cad45d5SLiqiang Tao while (!Calls->empty() && Calls->front().first->getCaller() == &F) { 2166cad45d5SLiqiang Tao auto P = Calls->pop(); 2176cad45d5SLiqiang Tao CallBase *CB = P.first; 2186cad45d5SLiqiang Tao const int InlineHistoryID = P.second; 2196cad45d5SLiqiang Tao Function &Callee = *CB->getCalledFunction(); 2206cad45d5SLiqiang Tao 2216cad45d5SLiqiang Tao if (InlineHistoryID != -1 && 2226cad45d5SLiqiang Tao inlineHistoryIncludes(&Callee, InlineHistoryID, InlineHistory)) { 2236cad45d5SLiqiang Tao setInlineRemark(*CB, "recursive"); 2246cad45d5SLiqiang Tao continue; 2256cad45d5SLiqiang Tao } 2266cad45d5SLiqiang Tao 2276cad45d5SLiqiang Tao auto Advice = Advisor.getAdvice(*CB, /*OnlyMandatory*/ false); 2286cad45d5SLiqiang Tao // Check whether we want to inline this callsite. 2296cad45d5SLiqiang Tao if (!Advice->isInliningRecommended()) { 2306cad45d5SLiqiang Tao Advice->recordUnattemptedInlining(); 2316cad45d5SLiqiang Tao continue; 2326cad45d5SLiqiang Tao } 2336cad45d5SLiqiang Tao 2346cad45d5SLiqiang Tao // Setup the data structure used to plumb customization into the 2356cad45d5SLiqiang Tao // `InlineFunction` routine. 2366cad45d5SLiqiang Tao InlineFunctionInfo IFI( 2376cad45d5SLiqiang Tao /*cg=*/nullptr, GetAssumptionCache, PSI, 2386cad45d5SLiqiang Tao &FAM.getResult<BlockFrequencyAnalysis>(*(CB->getCaller())), 2396cad45d5SLiqiang Tao &FAM.getResult<BlockFrequencyAnalysis>(Callee)); 2406cad45d5SLiqiang Tao 2416cad45d5SLiqiang Tao InlineResult IR = 2426cad45d5SLiqiang Tao InlineFunction(*CB, IFI, &FAM.getResult<AAManager>(*CB->getCaller())); 2436cad45d5SLiqiang Tao if (!IR.isSuccess()) { 2446cad45d5SLiqiang Tao Advice->recordUnsuccessfulInlining(IR); 2456cad45d5SLiqiang Tao continue; 2466cad45d5SLiqiang Tao } 2476cad45d5SLiqiang Tao 2486cad45d5SLiqiang Tao DidInline = true; 2496cad45d5SLiqiang Tao InlinedCallees.insert(&Callee); 2506cad45d5SLiqiang Tao ++NumInlined; 2516cad45d5SLiqiang Tao 2526cad45d5SLiqiang Tao LLVM_DEBUG(dbgs() << " Size after inlining: " 2536cad45d5SLiqiang Tao << F.getInstructionCount() << "\n"); 2546cad45d5SLiqiang Tao 2556cad45d5SLiqiang Tao // Add any new callsites to defined functions to the worklist. 2566cad45d5SLiqiang Tao if (!IFI.InlinedCallSites.empty()) { 2576cad45d5SLiqiang Tao int NewHistoryID = InlineHistory.size(); 2586cad45d5SLiqiang Tao InlineHistory.push_back({&Callee, InlineHistoryID}); 2596cad45d5SLiqiang Tao 2606cad45d5SLiqiang Tao for (CallBase *ICB : reverse(IFI.InlinedCallSites)) { 2616cad45d5SLiqiang Tao Function *NewCallee = ICB->getCalledFunction(); 2626cad45d5SLiqiang Tao if (!NewCallee) { 2636cad45d5SLiqiang Tao // Try to promote an indirect (virtual) call without waiting for 2646cad45d5SLiqiang Tao // the post-inline cleanup and the next DevirtSCCRepeatedPass 2656cad45d5SLiqiang Tao // iteration because the next iteration may not happen and we may 2666cad45d5SLiqiang Tao // miss inlining it. 2676cad45d5SLiqiang Tao if (tryPromoteCall(*ICB)) 2686cad45d5SLiqiang Tao NewCallee = ICB->getCalledFunction(); 2696cad45d5SLiqiang Tao } 2706cad45d5SLiqiang Tao if (NewCallee) 2716cad45d5SLiqiang Tao if (!NewCallee->isDeclaration()) 2726cad45d5SLiqiang Tao Calls->push({ICB, NewHistoryID}); 2736cad45d5SLiqiang Tao } 2746cad45d5SLiqiang Tao } 2756cad45d5SLiqiang Tao 2766cad45d5SLiqiang Tao // Merge the attributes based on the inlining. 2776cad45d5SLiqiang Tao AttributeFuncs::mergeAttributesForInlining(F, Callee); 2786cad45d5SLiqiang Tao 2796cad45d5SLiqiang Tao // For local functions, check whether this makes the callee trivially 2806cad45d5SLiqiang Tao // dead. In that case, we can drop the body of the function eagerly 2816cad45d5SLiqiang Tao // which may reduce the number of callers of other functions to one, 2826cad45d5SLiqiang Tao // changing inline cost thresholds. 2836cad45d5SLiqiang Tao bool CalleeWasDeleted = false; 2846cad45d5SLiqiang Tao if (Callee.hasLocalLinkage()) { 2856cad45d5SLiqiang Tao // To check this we also need to nuke any dead constant uses (perhaps 2866cad45d5SLiqiang Tao // made dead by this operation on other functions). 2876cad45d5SLiqiang Tao Callee.removeDeadConstantUsers(); 2886cad45d5SLiqiang Tao // if (Callee.use_empty() && !CG.isLibFunction(Callee)) { 2896cad45d5SLiqiang Tao if (Callee.use_empty() && !isKnownLibFunction(Callee, GetTLI(Callee))) { 2906cad45d5SLiqiang Tao Calls->erase_if([&](const std::pair<CallBase *, int> &Call) { 2916cad45d5SLiqiang Tao return Call.first->getCaller() == &Callee; 2926cad45d5SLiqiang Tao }); 2936cad45d5SLiqiang Tao // Clear the body and queue the function itself for deletion when we 2946cad45d5SLiqiang Tao // finish inlining. 2956cad45d5SLiqiang Tao // Note that after this point, it is an error to do anything other 2966cad45d5SLiqiang Tao // than use the callee's address or delete it. 2976cad45d5SLiqiang Tao Callee.dropAllReferences(); 2986cad45d5SLiqiang Tao assert(!is_contained(DeadFunctions, &Callee) && 2996cad45d5SLiqiang Tao "Cannot put cause a function to become dead twice!"); 3006cad45d5SLiqiang Tao DeadFunctions.push_back(&Callee); 3016cad45d5SLiqiang Tao CalleeWasDeleted = true; 3026cad45d5SLiqiang Tao } 3036cad45d5SLiqiang Tao } 3046cad45d5SLiqiang Tao if (CalleeWasDeleted) 3056cad45d5SLiqiang Tao Advice->recordInliningWithCalleeDeleted(); 3066cad45d5SLiqiang Tao else 3076cad45d5SLiqiang Tao Advice->recordInlining(); 3086cad45d5SLiqiang Tao } 3096cad45d5SLiqiang Tao 3106cad45d5SLiqiang Tao if (!DidInline) 3116cad45d5SLiqiang Tao continue; 3126cad45d5SLiqiang Tao Changed = true; 3136cad45d5SLiqiang Tao 3146cad45d5SLiqiang Tao InlinedCallees.clear(); 3156cad45d5SLiqiang Tao } 3166cad45d5SLiqiang Tao 3176cad45d5SLiqiang Tao // Now that we've finished inlining all of the calls across this module, 3186cad45d5SLiqiang Tao // delete all of the trivially dead functions. 3196cad45d5SLiqiang Tao // 3206cad45d5SLiqiang Tao // Note that this walks a pointer set which has non-deterministic order but 3216cad45d5SLiqiang Tao // that is OK as all we do is delete things and add pointers to unordered 3226cad45d5SLiqiang Tao // sets. 3236cad45d5SLiqiang Tao for (Function *DeadF : DeadFunctions) { 3246cad45d5SLiqiang Tao // Clear out any cached analyses. 3256cad45d5SLiqiang Tao FAM.clear(*DeadF, DeadF->getName()); 3266cad45d5SLiqiang Tao 3276cad45d5SLiqiang Tao // And delete the actual function from the module. 328fe827a93SArthur Eubanks M.getFunctionList().erase(DeadF); 3296cad45d5SLiqiang Tao 3306cad45d5SLiqiang Tao ++NumDeleted; 3316cad45d5SLiqiang Tao } 3326cad45d5SLiqiang Tao 3336cad45d5SLiqiang Tao if (!Changed) 3346cad45d5SLiqiang Tao return PreservedAnalyses::all(); 3356cad45d5SLiqiang Tao 3366cad45d5SLiqiang Tao return PreservedAnalyses::none(); 3376cad45d5SLiqiang Tao } 338