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"
21f1985a3fSserge-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"
29f1985a3fSserge-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.
inlineHistoryIncludes(Function * F,int InlineHistoryID,const SmallVectorImpl<std::pair<Function *,int>> & InlineHistory)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 
getAdvisor(const ModuleAnalysisManager & MAM,FunctionAnalysisManager & FAM,Module & M)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.
87*e0d06959SMingming Liu     OwnedAdvisor = std::make_unique<DefaultInlineAdvisor>(
88*e0d06959SMingming Liu         M, FAM, Params,
89*e0d06959SMingming Liu         InlineContext{LTOPhase, InlinePass::ModuleInliner});
906cad45d5SLiqiang Tao 
916cad45d5SLiqiang Tao     return *OwnedAdvisor;
926cad45d5SLiqiang Tao   }
936cad45d5SLiqiang Tao   assert(IAA->getAdvisor() &&
946cad45d5SLiqiang Tao          "Expected a present InlineAdvisorAnalysis also have an "
956cad45d5SLiqiang Tao          "InlineAdvisor initialized");
966cad45d5SLiqiang Tao   return *IAA->getAdvisor();
976cad45d5SLiqiang Tao }
986cad45d5SLiqiang Tao 
isKnownLibFunction(Function & F,TargetLibraryInfo & TLI)996cad45d5SLiqiang Tao static bool isKnownLibFunction(Function &F, TargetLibraryInfo &TLI) {
1006cad45d5SLiqiang Tao   LibFunc LF;
1016cad45d5SLiqiang Tao 
1026cad45d5SLiqiang Tao   // Either this is a normal library function or a "vectorizable"
1036cad45d5SLiqiang Tao   // function.  Not using the VFDatabase here because this query
1046cad45d5SLiqiang Tao   // is related only to libraries handled via the TLI.
1056cad45d5SLiqiang Tao   return TLI.getLibFunc(F, LF) ||
1066cad45d5SLiqiang Tao          TLI.isKnownVectorFunctionInLibrary(F.getName());
1076cad45d5SLiqiang Tao }
1086cad45d5SLiqiang Tao 
run(Module & M,ModuleAnalysisManager & MAM)1096cad45d5SLiqiang Tao PreservedAnalyses ModuleInlinerPass::run(Module &M,
1106cad45d5SLiqiang Tao                                          ModuleAnalysisManager &MAM) {
1116cad45d5SLiqiang Tao   LLVM_DEBUG(dbgs() << "---- Module Inliner is Running ---- \n");
1126cad45d5SLiqiang Tao 
1136cad45d5SLiqiang Tao   auto &IAA = MAM.getResult<InlineAdvisorAnalysis>(M);
114*e0d06959SMingming Liu   if (!IAA.tryCreate(
115*e0d06959SMingming Liu           Params, Mode, {},
116*e0d06959SMingming Liu           InlineContext{LTOPhase, InlinePass::ModuleInliner})) {
1176cad45d5SLiqiang Tao     M.getContext().emitError(
1186cad45d5SLiqiang Tao         "Could not setup Inlining Advisor for the requested "
1196cad45d5SLiqiang Tao         "mode and/or options");
1206cad45d5SLiqiang Tao     return PreservedAnalyses::all();
1216cad45d5SLiqiang Tao   }
1226cad45d5SLiqiang Tao 
1236cad45d5SLiqiang Tao   bool Changed = false;
1246cad45d5SLiqiang Tao 
1256cad45d5SLiqiang Tao   ProfileSummaryInfo *PSI = MAM.getCachedResult<ProfileSummaryAnalysis>(M);
1266cad45d5SLiqiang Tao 
1276cad45d5SLiqiang Tao   FunctionAnalysisManager &FAM =
1286cad45d5SLiqiang Tao       MAM.getResult<FunctionAnalysisManagerModuleProxy>(M).getManager();
1296cad45d5SLiqiang Tao 
1306cad45d5SLiqiang Tao   auto GetTLI = [&FAM](Function &F) -> TargetLibraryInfo & {
1316cad45d5SLiqiang Tao     return FAM.getResult<TargetLibraryAnalysis>(F);
1326cad45d5SLiqiang Tao   };
1336cad45d5SLiqiang Tao 
1346cad45d5SLiqiang Tao   InlineAdvisor &Advisor = getAdvisor(MAM, FAM, M);
1356cad45d5SLiqiang Tao   Advisor.onPassEntry();
1366cad45d5SLiqiang Tao 
1376cad45d5SLiqiang Tao   auto AdvisorOnExit = make_scope_exit([&] { Advisor.onPassExit(); });
1386cad45d5SLiqiang Tao 
1396cad45d5SLiqiang Tao   // In the module inliner, a priority-based worklist is used for calls across
1406cad45d5SLiqiang Tao   // the entire Module. With this module inliner, the inline order is not
1416cad45d5SLiqiang Tao   // limited to bottom-up order. More globally scope inline order is enabled.
1426cad45d5SLiqiang Tao   // Also, the inline deferral logic become unnecessary in this module inliner.
1436cad45d5SLiqiang Tao   // It is possible to use other priority heuristics, e.g. profile-based
1446cad45d5SLiqiang Tao   // heuristic.
1456cad45d5SLiqiang Tao   //
1466cad45d5SLiqiang Tao   // TODO: Here is a huge amount duplicate code between the module inliner and
1476cad45d5SLiqiang Tao   // the SCC inliner, which need some refactoring.
1486cad45d5SLiqiang Tao   std::unique_ptr<InlineOrder<std::pair<CallBase *, int>>> Calls;
1496cad45d5SLiqiang Tao   if (InlineEnablePriorityOrder)
15014e8add9SLiqiang Tao     Calls = std::make_unique<PriorityInlineOrder>(
15114e8add9SLiqiang Tao               std::make_unique<SizePriority>());
1526cad45d5SLiqiang Tao   else
1536cad45d5SLiqiang Tao     Calls = std::make_unique<DefaultInlineOrder<std::pair<CallBase *, int>>>();
1546cad45d5SLiqiang Tao   assert(Calls != nullptr && "Expected an initialized InlineOrder");
1556cad45d5SLiqiang Tao 
1566cad45d5SLiqiang Tao   // Populate the initial list of calls in this module.
1576cad45d5SLiqiang Tao   for (Function &F : M) {
1586cad45d5SLiqiang Tao     auto &ORE = FAM.getResult<OptimizationRemarkEmitterAnalysis>(F);
1596cad45d5SLiqiang Tao     // We want to generally process call sites top-down in order for
1606cad45d5SLiqiang Tao     // simplifications stemming from replacing the call with the returned value
1616cad45d5SLiqiang Tao     // after inlining to be visible to subsequent inlining decisions.
1626cad45d5SLiqiang Tao     // FIXME: Using instructions sequence is a really bad way to do this.
1636cad45d5SLiqiang Tao     // Instead we should do an actual RPO walk of the function body.
1646cad45d5SLiqiang Tao     for (Instruction &I : instructions(F))
1656cad45d5SLiqiang Tao       if (auto *CB = dyn_cast<CallBase>(&I))
1666cad45d5SLiqiang Tao         if (Function *Callee = CB->getCalledFunction()) {
1676cad45d5SLiqiang Tao           if (!Callee->isDeclaration())
1686cad45d5SLiqiang Tao             Calls->push({CB, -1});
1696cad45d5SLiqiang Tao           else if (!isa<IntrinsicInst>(I)) {
1706cad45d5SLiqiang Tao             using namespace ore;
1716cad45d5SLiqiang Tao             setInlineRemark(*CB, "unavailable definition");
1726cad45d5SLiqiang Tao             ORE.emit([&]() {
1736cad45d5SLiqiang Tao               return OptimizationRemarkMissed(DEBUG_TYPE, "NoDefinition", &I)
1746cad45d5SLiqiang Tao                      << NV("Callee", Callee) << " will not be inlined into "
1756cad45d5SLiqiang Tao                      << NV("Caller", CB->getCaller())
1766cad45d5SLiqiang Tao                      << " because its definition is unavailable"
1776cad45d5SLiqiang Tao                      << setIsVerbose();
1786cad45d5SLiqiang Tao             });
1796cad45d5SLiqiang Tao           }
1806cad45d5SLiqiang Tao         }
1816cad45d5SLiqiang Tao   }
1826cad45d5SLiqiang Tao   if (Calls->empty())
1836cad45d5SLiqiang Tao     return PreservedAnalyses::all();
1846cad45d5SLiqiang Tao 
1856cad45d5SLiqiang Tao   // When inlining a callee produces new call sites, we want to keep track of
1866cad45d5SLiqiang Tao   // the fact that they were inlined from the callee.  This allows us to avoid
1876cad45d5SLiqiang Tao   // infinite inlining in some obscure cases.  To represent this, we use an
1886cad45d5SLiqiang Tao   // index into the InlineHistory vector.
1896cad45d5SLiqiang Tao   SmallVector<std::pair<Function *, int>, 16> InlineHistory;
1906cad45d5SLiqiang Tao 
1916cad45d5SLiqiang Tao   // Track a set vector of inlined callees so that we can augment the caller
1926cad45d5SLiqiang Tao   // with all of their edges in the call graph before pruning out the ones that
1936cad45d5SLiqiang Tao   // got simplified away.
1946cad45d5SLiqiang Tao   SmallSetVector<Function *, 4> InlinedCallees;
1956cad45d5SLiqiang Tao 
1966cad45d5SLiqiang Tao   // Track the dead functions to delete once finished with inlining calls. We
1976cad45d5SLiqiang Tao   // defer deleting these to make it easier to handle the call graph updates.
1986cad45d5SLiqiang Tao   SmallVector<Function *, 4> DeadFunctions;
1996cad45d5SLiqiang Tao 
2006cad45d5SLiqiang Tao   // Loop forward over all of the calls.
2016cad45d5SLiqiang Tao   while (!Calls->empty()) {
2026cad45d5SLiqiang Tao     // We expect the calls to typically be batched with sequences of calls that
2036cad45d5SLiqiang Tao     // have the same caller, so we first set up some shared infrastructure for
2046cad45d5SLiqiang Tao     // this caller. We also do any pruning we can at this layer on the caller
2056cad45d5SLiqiang Tao     // alone.
2066cad45d5SLiqiang Tao     Function &F = *Calls->front().first->getCaller();
2076cad45d5SLiqiang Tao 
2086cad45d5SLiqiang Tao     LLVM_DEBUG(dbgs() << "Inlining calls in: " << F.getName() << "\n"
2096cad45d5SLiqiang Tao                       << "    Function size: " << F.getInstructionCount()
2106cad45d5SLiqiang Tao                       << "\n");
2116cad45d5SLiqiang Tao 
2126cad45d5SLiqiang Tao     auto GetAssumptionCache = [&](Function &F) -> AssumptionCache & {
2136cad45d5SLiqiang Tao       return FAM.getResult<AssumptionAnalysis>(F);
2146cad45d5SLiqiang Tao     };
2156cad45d5SLiqiang Tao 
2166cad45d5SLiqiang Tao     // Now process as many calls as we have within this caller in the sequence.
2176cad45d5SLiqiang Tao     // We bail out as soon as the caller has to change so we can
2186cad45d5SLiqiang Tao     // prepare the context of that new caller.
2196cad45d5SLiqiang Tao     bool DidInline = false;
2206cad45d5SLiqiang Tao     while (!Calls->empty() && Calls->front().first->getCaller() == &F) {
2216cad45d5SLiqiang Tao       auto P = Calls->pop();
2226cad45d5SLiqiang Tao       CallBase *CB = P.first;
2236cad45d5SLiqiang Tao       const int InlineHistoryID = P.second;
2246cad45d5SLiqiang Tao       Function &Callee = *CB->getCalledFunction();
2256cad45d5SLiqiang Tao 
2266cad45d5SLiqiang Tao       if (InlineHistoryID != -1 &&
2276cad45d5SLiqiang Tao           inlineHistoryIncludes(&Callee, InlineHistoryID, InlineHistory)) {
2286cad45d5SLiqiang Tao         setInlineRemark(*CB, "recursive");
2296cad45d5SLiqiang Tao         continue;
2306cad45d5SLiqiang Tao       }
2316cad45d5SLiqiang Tao 
2326cad45d5SLiqiang Tao       auto Advice = Advisor.getAdvice(*CB, /*OnlyMandatory*/ false);
2336cad45d5SLiqiang Tao       // Check whether we want to inline this callsite.
2346cad45d5SLiqiang Tao       if (!Advice->isInliningRecommended()) {
2356cad45d5SLiqiang Tao         Advice->recordUnattemptedInlining();
2366cad45d5SLiqiang Tao         continue;
2376cad45d5SLiqiang Tao       }
2386cad45d5SLiqiang Tao 
2396cad45d5SLiqiang Tao       // Setup the data structure used to plumb customization into the
2406cad45d5SLiqiang Tao       // `InlineFunction` routine.
2416cad45d5SLiqiang Tao       InlineFunctionInfo IFI(
2426cad45d5SLiqiang Tao           /*cg=*/nullptr, GetAssumptionCache, PSI,
2436cad45d5SLiqiang Tao           &FAM.getResult<BlockFrequencyAnalysis>(*(CB->getCaller())),
2446cad45d5SLiqiang Tao           &FAM.getResult<BlockFrequencyAnalysis>(Callee));
2456cad45d5SLiqiang Tao 
2466cad45d5SLiqiang Tao       InlineResult IR =
2476cad45d5SLiqiang Tao           InlineFunction(*CB, IFI, &FAM.getResult<AAManager>(*CB->getCaller()));
2486cad45d5SLiqiang Tao       if (!IR.isSuccess()) {
2496cad45d5SLiqiang Tao         Advice->recordUnsuccessfulInlining(IR);
2506cad45d5SLiqiang Tao         continue;
2516cad45d5SLiqiang Tao       }
2526cad45d5SLiqiang Tao 
2536cad45d5SLiqiang Tao       DidInline = true;
2546cad45d5SLiqiang Tao       InlinedCallees.insert(&Callee);
2556cad45d5SLiqiang Tao       ++NumInlined;
2566cad45d5SLiqiang Tao 
2576cad45d5SLiqiang Tao       LLVM_DEBUG(dbgs() << "    Size after inlining: "
2586cad45d5SLiqiang Tao                         << F.getInstructionCount() << "\n");
2596cad45d5SLiqiang Tao 
2606cad45d5SLiqiang Tao       // Add any new callsites to defined functions to the worklist.
2616cad45d5SLiqiang Tao       if (!IFI.InlinedCallSites.empty()) {
2626cad45d5SLiqiang Tao         int NewHistoryID = InlineHistory.size();
2636cad45d5SLiqiang Tao         InlineHistory.push_back({&Callee, InlineHistoryID});
2646cad45d5SLiqiang Tao 
2656cad45d5SLiqiang Tao         for (CallBase *ICB : reverse(IFI.InlinedCallSites)) {
2666cad45d5SLiqiang Tao           Function *NewCallee = ICB->getCalledFunction();
2676cad45d5SLiqiang Tao           if (!NewCallee) {
2686cad45d5SLiqiang Tao             // Try to promote an indirect (virtual) call without waiting for
2696cad45d5SLiqiang Tao             // the post-inline cleanup and the next DevirtSCCRepeatedPass
2706cad45d5SLiqiang Tao             // iteration because the next iteration may not happen and we may
2716cad45d5SLiqiang Tao             // miss inlining it.
2726cad45d5SLiqiang Tao             if (tryPromoteCall(*ICB))
2736cad45d5SLiqiang Tao               NewCallee = ICB->getCalledFunction();
2746cad45d5SLiqiang Tao           }
2756cad45d5SLiqiang Tao           if (NewCallee)
2766cad45d5SLiqiang Tao             if (!NewCallee->isDeclaration())
2776cad45d5SLiqiang Tao               Calls->push({ICB, NewHistoryID});
2786cad45d5SLiqiang Tao         }
2796cad45d5SLiqiang Tao       }
2806cad45d5SLiqiang Tao 
2816cad45d5SLiqiang Tao       // Merge the attributes based on the inlining.
2826cad45d5SLiqiang Tao       AttributeFuncs::mergeAttributesForInlining(F, Callee);
2836cad45d5SLiqiang Tao 
2846cad45d5SLiqiang Tao       // For local functions, check whether this makes the callee trivially
2856cad45d5SLiqiang Tao       // dead. In that case, we can drop the body of the function eagerly
2866cad45d5SLiqiang Tao       // which may reduce the number of callers of other functions to one,
2876cad45d5SLiqiang Tao       // changing inline cost thresholds.
2886cad45d5SLiqiang Tao       bool CalleeWasDeleted = false;
2896cad45d5SLiqiang Tao       if (Callee.hasLocalLinkage()) {
2906cad45d5SLiqiang Tao         // To check this we also need to nuke any dead constant uses (perhaps
2916cad45d5SLiqiang Tao         // made dead by this operation on other functions).
2926cad45d5SLiqiang Tao         Callee.removeDeadConstantUsers();
2936cad45d5SLiqiang Tao         // if (Callee.use_empty() && !CG.isLibFunction(Callee)) {
2946cad45d5SLiqiang Tao         if (Callee.use_empty() && !isKnownLibFunction(Callee, GetTLI(Callee))) {
2956cad45d5SLiqiang Tao           Calls->erase_if([&](const std::pair<CallBase *, int> &Call) {
2966cad45d5SLiqiang Tao             return Call.first->getCaller() == &Callee;
2976cad45d5SLiqiang Tao           });
2986cad45d5SLiqiang Tao           // Clear the body and queue the function itself for deletion when we
2996cad45d5SLiqiang Tao           // finish inlining.
3006cad45d5SLiqiang Tao           // Note that after this point, it is an error to do anything other
3016cad45d5SLiqiang Tao           // than use the callee's address or delete it.
3026cad45d5SLiqiang Tao           Callee.dropAllReferences();
3036cad45d5SLiqiang Tao           assert(!is_contained(DeadFunctions, &Callee) &&
3046cad45d5SLiqiang Tao                  "Cannot put cause a function to become dead twice!");
3056cad45d5SLiqiang Tao           DeadFunctions.push_back(&Callee);
3066cad45d5SLiqiang Tao           CalleeWasDeleted = true;
3076cad45d5SLiqiang Tao         }
3086cad45d5SLiqiang Tao       }
3096cad45d5SLiqiang Tao       if (CalleeWasDeleted)
3106cad45d5SLiqiang Tao         Advice->recordInliningWithCalleeDeleted();
3116cad45d5SLiqiang Tao       else
3126cad45d5SLiqiang Tao         Advice->recordInlining();
3136cad45d5SLiqiang Tao     }
3146cad45d5SLiqiang Tao 
3156cad45d5SLiqiang Tao     if (!DidInline)
3166cad45d5SLiqiang Tao       continue;
3176cad45d5SLiqiang Tao     Changed = true;
3186cad45d5SLiqiang Tao 
3196cad45d5SLiqiang Tao     InlinedCallees.clear();
3206cad45d5SLiqiang Tao   }
3216cad45d5SLiqiang Tao 
3226cad45d5SLiqiang Tao   // Now that we've finished inlining all of the calls across this module,
3236cad45d5SLiqiang Tao   // delete all of the trivially dead functions.
3246cad45d5SLiqiang Tao   //
3256cad45d5SLiqiang Tao   // Note that this walks a pointer set which has non-deterministic order but
3266cad45d5SLiqiang Tao   // that is OK as all we do is delete things and add pointers to unordered
3276cad45d5SLiqiang Tao   // sets.
3286cad45d5SLiqiang Tao   for (Function *DeadF : DeadFunctions) {
3296cad45d5SLiqiang Tao     // Clear out any cached analyses.
3306cad45d5SLiqiang Tao     FAM.clear(*DeadF, DeadF->getName());
3316cad45d5SLiqiang Tao 
3326cad45d5SLiqiang Tao     // And delete the actual function from the module.
333fe827a93SArthur Eubanks     M.getFunctionList().erase(DeadF);
3346cad45d5SLiqiang Tao 
3356cad45d5SLiqiang Tao     ++NumDeleted;
3366cad45d5SLiqiang Tao   }
3376cad45d5SLiqiang Tao 
3386cad45d5SLiqiang Tao   if (!Changed)
3396cad45d5SLiqiang Tao     return PreservedAnalyses::all();
3406cad45d5SLiqiang Tao 
3416cad45d5SLiqiang Tao   return PreservedAnalyses::none();
3426cad45d5SLiqiang Tao }
343