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