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