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