1*6cad45d5SLiqiang Tao //===- ModuleInliner.cpp - Code related to module inliner -----------------===//
2*6cad45d5SLiqiang Tao //
3*6cad45d5SLiqiang Tao // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*6cad45d5SLiqiang Tao // See https://llvm.org/LICENSE.txt for license information.
5*6cad45d5SLiqiang Tao // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*6cad45d5SLiqiang Tao //
7*6cad45d5SLiqiang Tao //===----------------------------------------------------------------------===//
8*6cad45d5SLiqiang Tao //
9*6cad45d5SLiqiang Tao // This file implements the mechanics required to implement inlining without
10*6cad45d5SLiqiang Tao // missing any calls in the module level. It doesn't need any infromation about
11*6cad45d5SLiqiang Tao // SCC or call graph, which is different from the SCC inliner.  The decisions of
12*6cad45d5SLiqiang Tao // which calls are profitable to inline are implemented elsewhere.
13*6cad45d5SLiqiang Tao //
14*6cad45d5SLiqiang Tao //===----------------------------------------------------------------------===//
15*6cad45d5SLiqiang Tao 
16*6cad45d5SLiqiang Tao #include "llvm/Transforms/IPO/ModuleInliner.h"
17*6cad45d5SLiqiang Tao #include "llvm/ADT/DenseMap.h"
18*6cad45d5SLiqiang Tao #include "llvm/ADT/ScopeExit.h"
19*6cad45d5SLiqiang Tao #include "llvm/ADT/SetVector.h"
20*6cad45d5SLiqiang Tao #include "llvm/ADT/SmallPtrSet.h"
21*6cad45d5SLiqiang Tao #include "llvm/ADT/SmallVector.h"
22*6cad45d5SLiqiang Tao #include "llvm/ADT/Statistic.h"
23*6cad45d5SLiqiang Tao #include "llvm/Analysis/AssumptionCache.h"
24*6cad45d5SLiqiang Tao #include "llvm/Analysis/BlockFrequencyInfo.h"
25*6cad45d5SLiqiang Tao #include "llvm/Analysis/GlobalsModRef.h"
26*6cad45d5SLiqiang Tao #include "llvm/Analysis/InlineAdvisor.h"
27*6cad45d5SLiqiang Tao #include "llvm/Analysis/InlineCost.h"
28*6cad45d5SLiqiang Tao #include "llvm/Analysis/InlineOrder.h"
29*6cad45d5SLiqiang Tao #include "llvm/Analysis/OptimizationRemarkEmitter.h"
30*6cad45d5SLiqiang Tao #include "llvm/Analysis/ProfileSummaryInfo.h"
31*6cad45d5SLiqiang Tao #include "llvm/Analysis/TargetLibraryInfo.h"
32*6cad45d5SLiqiang Tao #include "llvm/Analysis/TargetTransformInfo.h"
33*6cad45d5SLiqiang Tao #include "llvm/IR/DebugLoc.h"
34*6cad45d5SLiqiang Tao #include "llvm/IR/DiagnosticInfo.h"
35*6cad45d5SLiqiang Tao #include "llvm/IR/Function.h"
36*6cad45d5SLiqiang Tao #include "llvm/IR/InstIterator.h"
37*6cad45d5SLiqiang Tao #include "llvm/IR/Instruction.h"
38*6cad45d5SLiqiang Tao #include "llvm/IR/Instructions.h"
39*6cad45d5SLiqiang Tao #include "llvm/IR/IntrinsicInst.h"
40*6cad45d5SLiqiang Tao #include "llvm/IR/Metadata.h"
41*6cad45d5SLiqiang Tao #include "llvm/IR/Module.h"
42*6cad45d5SLiqiang Tao #include "llvm/IR/PassManager.h"
43*6cad45d5SLiqiang Tao #include "llvm/IR/User.h"
44*6cad45d5SLiqiang Tao #include "llvm/IR/Value.h"
45*6cad45d5SLiqiang Tao #include "llvm/Support/CommandLine.h"
46*6cad45d5SLiqiang Tao #include "llvm/Support/Debug.h"
47*6cad45d5SLiqiang Tao #include "llvm/Support/raw_ostream.h"
48*6cad45d5SLiqiang Tao #include "llvm/Transforms/Utils/CallPromotionUtils.h"
49*6cad45d5SLiqiang Tao #include "llvm/Transforms/Utils/Cloning.h"
50*6cad45d5SLiqiang Tao #include "llvm/Transforms/Utils/Local.h"
51*6cad45d5SLiqiang Tao #include "llvm/Transforms/Utils/ModuleUtils.h"
52*6cad45d5SLiqiang Tao #include <cassert>
53*6cad45d5SLiqiang Tao #include <functional>
54*6cad45d5SLiqiang Tao 
55*6cad45d5SLiqiang Tao using namespace llvm;
56*6cad45d5SLiqiang Tao 
57*6cad45d5SLiqiang Tao #define DEBUG_TYPE "module-inline"
58*6cad45d5SLiqiang Tao 
59*6cad45d5SLiqiang Tao STATISTIC(NumInlined, "Number of functions inlined");
60*6cad45d5SLiqiang Tao STATISTIC(NumDeleted, "Number of functions deleted because all callers found");
61*6cad45d5SLiqiang Tao 
62*6cad45d5SLiqiang Tao static cl::opt<bool> InlineEnablePriorityOrder(
63*6cad45d5SLiqiang Tao     "module-inline-enable-priority-order", cl::Hidden, cl::init(true),
64*6cad45d5SLiqiang Tao     cl::desc("Enable the priority inline order for the module inliner"));
65*6cad45d5SLiqiang Tao 
66*6cad45d5SLiqiang Tao /// Return true if the specified inline history ID
67*6cad45d5SLiqiang Tao /// indicates an inline history that includes the specified function.
68*6cad45d5SLiqiang Tao static bool inlineHistoryIncludes(
69*6cad45d5SLiqiang Tao     Function *F, int InlineHistoryID,
70*6cad45d5SLiqiang Tao     const SmallVectorImpl<std::pair<Function *, int>> &InlineHistory) {
71*6cad45d5SLiqiang Tao   while (InlineHistoryID != -1) {
72*6cad45d5SLiqiang Tao     assert(unsigned(InlineHistoryID) < InlineHistory.size() &&
73*6cad45d5SLiqiang Tao            "Invalid inline history ID");
74*6cad45d5SLiqiang Tao     if (InlineHistory[InlineHistoryID].first == F)
75*6cad45d5SLiqiang Tao       return true;
76*6cad45d5SLiqiang Tao     InlineHistoryID = InlineHistory[InlineHistoryID].second;
77*6cad45d5SLiqiang Tao   }
78*6cad45d5SLiqiang Tao   return false;
79*6cad45d5SLiqiang Tao }
80*6cad45d5SLiqiang Tao 
81*6cad45d5SLiqiang Tao InlineAdvisor &ModuleInlinerPass::getAdvisor(const ModuleAnalysisManager &MAM,
82*6cad45d5SLiqiang Tao                                              FunctionAnalysisManager &FAM,
83*6cad45d5SLiqiang Tao                                              Module &M) {
84*6cad45d5SLiqiang Tao   if (OwnedAdvisor)
85*6cad45d5SLiqiang Tao     return *OwnedAdvisor;
86*6cad45d5SLiqiang Tao 
87*6cad45d5SLiqiang Tao   auto *IAA = MAM.getCachedResult<InlineAdvisorAnalysis>(M);
88*6cad45d5SLiqiang Tao   if (!IAA) {
89*6cad45d5SLiqiang Tao     // It should still be possible to run the inliner as a stand-alone module
90*6cad45d5SLiqiang Tao     // pass, for test scenarios. In that case, we default to the
91*6cad45d5SLiqiang Tao     // DefaultInlineAdvisor, which doesn't need to keep state between module
92*6cad45d5SLiqiang Tao     // pass runs. It also uses just the default InlineParams. In this case, we
93*6cad45d5SLiqiang Tao     // need to use the provided FAM, which is valid for the duration of the
94*6cad45d5SLiqiang Tao     // inliner pass, and thus the lifetime of the owned advisor. The one we
95*6cad45d5SLiqiang Tao     // would get from the MAM can be invalidated as a result of the inliner's
96*6cad45d5SLiqiang Tao     // activity.
97*6cad45d5SLiqiang Tao     OwnedAdvisor = std::make_unique<DefaultInlineAdvisor>(M, FAM, Params);
98*6cad45d5SLiqiang Tao 
99*6cad45d5SLiqiang Tao     return *OwnedAdvisor;
100*6cad45d5SLiqiang Tao   }
101*6cad45d5SLiqiang Tao   assert(IAA->getAdvisor() &&
102*6cad45d5SLiqiang Tao          "Expected a present InlineAdvisorAnalysis also have an "
103*6cad45d5SLiqiang Tao          "InlineAdvisor initialized");
104*6cad45d5SLiqiang Tao   return *IAA->getAdvisor();
105*6cad45d5SLiqiang Tao }
106*6cad45d5SLiqiang Tao 
107*6cad45d5SLiqiang Tao static bool isKnownLibFunction(Function &F, TargetLibraryInfo &TLI) {
108*6cad45d5SLiqiang Tao   LibFunc LF;
109*6cad45d5SLiqiang Tao 
110*6cad45d5SLiqiang Tao   // Either this is a normal library function or a "vectorizable"
111*6cad45d5SLiqiang Tao   // function.  Not using the VFDatabase here because this query
112*6cad45d5SLiqiang Tao   // is related only to libraries handled via the TLI.
113*6cad45d5SLiqiang Tao   return TLI.getLibFunc(F, LF) ||
114*6cad45d5SLiqiang Tao          TLI.isKnownVectorFunctionInLibrary(F.getName());
115*6cad45d5SLiqiang Tao }
116*6cad45d5SLiqiang Tao 
117*6cad45d5SLiqiang Tao PreservedAnalyses ModuleInlinerPass::run(Module &M,
118*6cad45d5SLiqiang Tao                                          ModuleAnalysisManager &MAM) {
119*6cad45d5SLiqiang Tao   LLVM_DEBUG(dbgs() << "---- Module Inliner is Running ---- \n");
120*6cad45d5SLiqiang Tao 
121*6cad45d5SLiqiang Tao   auto &IAA = MAM.getResult<InlineAdvisorAnalysis>(M);
122*6cad45d5SLiqiang Tao   if (!IAA.tryCreate(Params, Mode, {})) {
123*6cad45d5SLiqiang Tao     M.getContext().emitError(
124*6cad45d5SLiqiang Tao         "Could not setup Inlining Advisor for the requested "
125*6cad45d5SLiqiang Tao         "mode and/or options");
126*6cad45d5SLiqiang Tao     return PreservedAnalyses::all();
127*6cad45d5SLiqiang Tao   }
128*6cad45d5SLiqiang Tao 
129*6cad45d5SLiqiang Tao   bool Changed = false;
130*6cad45d5SLiqiang Tao 
131*6cad45d5SLiqiang Tao   ProfileSummaryInfo *PSI = MAM.getCachedResult<ProfileSummaryAnalysis>(M);
132*6cad45d5SLiqiang Tao 
133*6cad45d5SLiqiang Tao   FunctionAnalysisManager &FAM =
134*6cad45d5SLiqiang Tao       MAM.getResult<FunctionAnalysisManagerModuleProxy>(M).getManager();
135*6cad45d5SLiqiang Tao 
136*6cad45d5SLiqiang Tao   auto GetTLI = [&FAM](Function &F) -> TargetLibraryInfo & {
137*6cad45d5SLiqiang Tao     return FAM.getResult<TargetLibraryAnalysis>(F);
138*6cad45d5SLiqiang Tao   };
139*6cad45d5SLiqiang Tao 
140*6cad45d5SLiqiang Tao   InlineAdvisor &Advisor = getAdvisor(MAM, FAM, M);
141*6cad45d5SLiqiang Tao   Advisor.onPassEntry();
142*6cad45d5SLiqiang Tao 
143*6cad45d5SLiqiang Tao   auto AdvisorOnExit = make_scope_exit([&] { Advisor.onPassExit(); });
144*6cad45d5SLiqiang Tao 
145*6cad45d5SLiqiang Tao   // In the module inliner, a priority-based worklist is used for calls across
146*6cad45d5SLiqiang Tao   // the entire Module. With this module inliner, the inline order is not
147*6cad45d5SLiqiang Tao   // limited to bottom-up order. More globally scope inline order is enabled.
148*6cad45d5SLiqiang Tao   // Also, the inline deferral logic become unnecessary in this module inliner.
149*6cad45d5SLiqiang Tao   // It is possible to use other priority heuristics, e.g. profile-based
150*6cad45d5SLiqiang Tao   // heuristic.
151*6cad45d5SLiqiang Tao   //
152*6cad45d5SLiqiang Tao   // TODO: Here is a huge amount duplicate code between the module inliner and
153*6cad45d5SLiqiang Tao   // the SCC inliner, which need some refactoring.
154*6cad45d5SLiqiang Tao   std::unique_ptr<InlineOrder<std::pair<CallBase *, int>>> Calls;
155*6cad45d5SLiqiang Tao   if (InlineEnablePriorityOrder)
156*6cad45d5SLiqiang Tao     Calls = std::make_unique<PriorityInlineOrder<InlineSizePriority>>();
157*6cad45d5SLiqiang Tao   else
158*6cad45d5SLiqiang Tao     Calls = std::make_unique<DefaultInlineOrder<std::pair<CallBase *, int>>>();
159*6cad45d5SLiqiang Tao   assert(Calls != nullptr && "Expected an initialized InlineOrder");
160*6cad45d5SLiqiang Tao 
161*6cad45d5SLiqiang Tao   // Populate the initial list of calls in this module.
162*6cad45d5SLiqiang Tao   for (Function &F : M) {
163*6cad45d5SLiqiang Tao     auto &ORE = FAM.getResult<OptimizationRemarkEmitterAnalysis>(F);
164*6cad45d5SLiqiang Tao     // We want to generally process call sites top-down in order for
165*6cad45d5SLiqiang Tao     // simplifications stemming from replacing the call with the returned value
166*6cad45d5SLiqiang Tao     // after inlining to be visible to subsequent inlining decisions.
167*6cad45d5SLiqiang Tao     // FIXME: Using instructions sequence is a really bad way to do this.
168*6cad45d5SLiqiang Tao     // Instead we should do an actual RPO walk of the function body.
169*6cad45d5SLiqiang Tao     for (Instruction &I : instructions(F))
170*6cad45d5SLiqiang Tao       if (auto *CB = dyn_cast<CallBase>(&I))
171*6cad45d5SLiqiang Tao         if (Function *Callee = CB->getCalledFunction()) {
172*6cad45d5SLiqiang Tao           if (!Callee->isDeclaration())
173*6cad45d5SLiqiang Tao             Calls->push({CB, -1});
174*6cad45d5SLiqiang Tao           else if (!isa<IntrinsicInst>(I)) {
175*6cad45d5SLiqiang Tao             using namespace ore;
176*6cad45d5SLiqiang Tao             setInlineRemark(*CB, "unavailable definition");
177*6cad45d5SLiqiang Tao             ORE.emit([&]() {
178*6cad45d5SLiqiang Tao               return OptimizationRemarkMissed(DEBUG_TYPE, "NoDefinition", &I)
179*6cad45d5SLiqiang Tao                      << NV("Callee", Callee) << " will not be inlined into "
180*6cad45d5SLiqiang Tao                      << NV("Caller", CB->getCaller())
181*6cad45d5SLiqiang Tao                      << " because its definition is unavailable"
182*6cad45d5SLiqiang Tao                      << setIsVerbose();
183*6cad45d5SLiqiang Tao             });
184*6cad45d5SLiqiang Tao           }
185*6cad45d5SLiqiang Tao         }
186*6cad45d5SLiqiang Tao   }
187*6cad45d5SLiqiang Tao   if (Calls->empty())
188*6cad45d5SLiqiang Tao     return PreservedAnalyses::all();
189*6cad45d5SLiqiang Tao 
190*6cad45d5SLiqiang Tao   // When inlining a callee produces new call sites, we want to keep track of
191*6cad45d5SLiqiang Tao   // the fact that they were inlined from the callee.  This allows us to avoid
192*6cad45d5SLiqiang Tao   // infinite inlining in some obscure cases.  To represent this, we use an
193*6cad45d5SLiqiang Tao   // index into the InlineHistory vector.
194*6cad45d5SLiqiang Tao   SmallVector<std::pair<Function *, int>, 16> InlineHistory;
195*6cad45d5SLiqiang Tao 
196*6cad45d5SLiqiang Tao   // Track a set vector of inlined callees so that we can augment the caller
197*6cad45d5SLiqiang Tao   // with all of their edges in the call graph before pruning out the ones that
198*6cad45d5SLiqiang Tao   // got simplified away.
199*6cad45d5SLiqiang Tao   SmallSetVector<Function *, 4> InlinedCallees;
200*6cad45d5SLiqiang Tao 
201*6cad45d5SLiqiang Tao   // Track the dead functions to delete once finished with inlining calls. We
202*6cad45d5SLiqiang Tao   // defer deleting these to make it easier to handle the call graph updates.
203*6cad45d5SLiqiang Tao   SmallVector<Function *, 4> DeadFunctions;
204*6cad45d5SLiqiang Tao 
205*6cad45d5SLiqiang Tao   // Loop forward over all of the calls.
206*6cad45d5SLiqiang Tao   while (!Calls->empty()) {
207*6cad45d5SLiqiang Tao     // We expect the calls to typically be batched with sequences of calls that
208*6cad45d5SLiqiang Tao     // have the same caller, so we first set up some shared infrastructure for
209*6cad45d5SLiqiang Tao     // this caller. We also do any pruning we can at this layer on the caller
210*6cad45d5SLiqiang Tao     // alone.
211*6cad45d5SLiqiang Tao     Function &F = *Calls->front().first->getCaller();
212*6cad45d5SLiqiang Tao 
213*6cad45d5SLiqiang Tao     LLVM_DEBUG(dbgs() << "Inlining calls in: " << F.getName() << "\n"
214*6cad45d5SLiqiang Tao                       << "    Function size: " << F.getInstructionCount()
215*6cad45d5SLiqiang Tao                       << "\n");
216*6cad45d5SLiqiang Tao 
217*6cad45d5SLiqiang Tao     auto GetAssumptionCache = [&](Function &F) -> AssumptionCache & {
218*6cad45d5SLiqiang Tao       return FAM.getResult<AssumptionAnalysis>(F);
219*6cad45d5SLiqiang Tao     };
220*6cad45d5SLiqiang Tao 
221*6cad45d5SLiqiang Tao     // Now process as many calls as we have within this caller in the sequence.
222*6cad45d5SLiqiang Tao     // We bail out as soon as the caller has to change so we can
223*6cad45d5SLiqiang Tao     // prepare the context of that new caller.
224*6cad45d5SLiqiang Tao     bool DidInline = false;
225*6cad45d5SLiqiang Tao     while (!Calls->empty() && Calls->front().first->getCaller() == &F) {
226*6cad45d5SLiqiang Tao       auto P = Calls->pop();
227*6cad45d5SLiqiang Tao       CallBase *CB = P.first;
228*6cad45d5SLiqiang Tao       const int InlineHistoryID = P.second;
229*6cad45d5SLiqiang Tao       Function &Callee = *CB->getCalledFunction();
230*6cad45d5SLiqiang Tao 
231*6cad45d5SLiqiang Tao       if (InlineHistoryID != -1 &&
232*6cad45d5SLiqiang Tao           inlineHistoryIncludes(&Callee, InlineHistoryID, InlineHistory)) {
233*6cad45d5SLiqiang Tao         setInlineRemark(*CB, "recursive");
234*6cad45d5SLiqiang Tao         continue;
235*6cad45d5SLiqiang Tao       }
236*6cad45d5SLiqiang Tao 
237*6cad45d5SLiqiang Tao       auto Advice = Advisor.getAdvice(*CB, /*OnlyMandatory*/ false);
238*6cad45d5SLiqiang Tao       // Check whether we want to inline this callsite.
239*6cad45d5SLiqiang Tao       if (!Advice->isInliningRecommended()) {
240*6cad45d5SLiqiang Tao         Advice->recordUnattemptedInlining();
241*6cad45d5SLiqiang Tao         continue;
242*6cad45d5SLiqiang Tao       }
243*6cad45d5SLiqiang Tao 
244*6cad45d5SLiqiang Tao       // Setup the data structure used to plumb customization into the
245*6cad45d5SLiqiang Tao       // `InlineFunction` routine.
246*6cad45d5SLiqiang Tao       InlineFunctionInfo IFI(
247*6cad45d5SLiqiang Tao           /*cg=*/nullptr, GetAssumptionCache, PSI,
248*6cad45d5SLiqiang Tao           &FAM.getResult<BlockFrequencyAnalysis>(*(CB->getCaller())),
249*6cad45d5SLiqiang Tao           &FAM.getResult<BlockFrequencyAnalysis>(Callee));
250*6cad45d5SLiqiang Tao 
251*6cad45d5SLiqiang Tao       InlineResult IR =
252*6cad45d5SLiqiang Tao           InlineFunction(*CB, IFI, &FAM.getResult<AAManager>(*CB->getCaller()));
253*6cad45d5SLiqiang Tao       if (!IR.isSuccess()) {
254*6cad45d5SLiqiang Tao         Advice->recordUnsuccessfulInlining(IR);
255*6cad45d5SLiqiang Tao         continue;
256*6cad45d5SLiqiang Tao       }
257*6cad45d5SLiqiang Tao 
258*6cad45d5SLiqiang Tao       DidInline = true;
259*6cad45d5SLiqiang Tao       InlinedCallees.insert(&Callee);
260*6cad45d5SLiqiang Tao       ++NumInlined;
261*6cad45d5SLiqiang Tao 
262*6cad45d5SLiqiang Tao       LLVM_DEBUG(dbgs() << "    Size after inlining: "
263*6cad45d5SLiqiang Tao                         << F.getInstructionCount() << "\n");
264*6cad45d5SLiqiang Tao 
265*6cad45d5SLiqiang Tao       // Add any new callsites to defined functions to the worklist.
266*6cad45d5SLiqiang Tao       if (!IFI.InlinedCallSites.empty()) {
267*6cad45d5SLiqiang Tao         int NewHistoryID = InlineHistory.size();
268*6cad45d5SLiqiang Tao         InlineHistory.push_back({&Callee, InlineHistoryID});
269*6cad45d5SLiqiang Tao 
270*6cad45d5SLiqiang Tao         for (CallBase *ICB : reverse(IFI.InlinedCallSites)) {
271*6cad45d5SLiqiang Tao           Function *NewCallee = ICB->getCalledFunction();
272*6cad45d5SLiqiang Tao           if (!NewCallee) {
273*6cad45d5SLiqiang Tao             // Try to promote an indirect (virtual) call without waiting for
274*6cad45d5SLiqiang Tao             // the post-inline cleanup and the next DevirtSCCRepeatedPass
275*6cad45d5SLiqiang Tao             // iteration because the next iteration may not happen and we may
276*6cad45d5SLiqiang Tao             // miss inlining it.
277*6cad45d5SLiqiang Tao             if (tryPromoteCall(*ICB))
278*6cad45d5SLiqiang Tao               NewCallee = ICB->getCalledFunction();
279*6cad45d5SLiqiang Tao           }
280*6cad45d5SLiqiang Tao           if (NewCallee)
281*6cad45d5SLiqiang Tao             if (!NewCallee->isDeclaration())
282*6cad45d5SLiqiang Tao               Calls->push({ICB, NewHistoryID});
283*6cad45d5SLiqiang Tao         }
284*6cad45d5SLiqiang Tao       }
285*6cad45d5SLiqiang Tao 
286*6cad45d5SLiqiang Tao       // Merge the attributes based on the inlining.
287*6cad45d5SLiqiang Tao       AttributeFuncs::mergeAttributesForInlining(F, Callee);
288*6cad45d5SLiqiang Tao 
289*6cad45d5SLiqiang Tao       // For local functions, check whether this makes the callee trivially
290*6cad45d5SLiqiang Tao       // dead. In that case, we can drop the body of the function eagerly
291*6cad45d5SLiqiang Tao       // which may reduce the number of callers of other functions to one,
292*6cad45d5SLiqiang Tao       // changing inline cost thresholds.
293*6cad45d5SLiqiang Tao       bool CalleeWasDeleted = false;
294*6cad45d5SLiqiang Tao       if (Callee.hasLocalLinkage()) {
295*6cad45d5SLiqiang Tao         // To check this we also need to nuke any dead constant uses (perhaps
296*6cad45d5SLiqiang Tao         // made dead by this operation on other functions).
297*6cad45d5SLiqiang Tao         Callee.removeDeadConstantUsers();
298*6cad45d5SLiqiang Tao         // if (Callee.use_empty() && !CG.isLibFunction(Callee)) {
299*6cad45d5SLiqiang Tao         if (Callee.use_empty() && !isKnownLibFunction(Callee, GetTLI(Callee))) {
300*6cad45d5SLiqiang Tao           Calls->erase_if([&](const std::pair<CallBase *, int> &Call) {
301*6cad45d5SLiqiang Tao             return Call.first->getCaller() == &Callee;
302*6cad45d5SLiqiang Tao           });
303*6cad45d5SLiqiang Tao           // Clear the body and queue the function itself for deletion when we
304*6cad45d5SLiqiang Tao           // finish inlining.
305*6cad45d5SLiqiang Tao           // Note that after this point, it is an error to do anything other
306*6cad45d5SLiqiang Tao           // than use the callee's address or delete it.
307*6cad45d5SLiqiang Tao           Callee.dropAllReferences();
308*6cad45d5SLiqiang Tao           assert(!is_contained(DeadFunctions, &Callee) &&
309*6cad45d5SLiqiang Tao                  "Cannot put cause a function to become dead twice!");
310*6cad45d5SLiqiang Tao           DeadFunctions.push_back(&Callee);
311*6cad45d5SLiqiang Tao           CalleeWasDeleted = true;
312*6cad45d5SLiqiang Tao         }
313*6cad45d5SLiqiang Tao       }
314*6cad45d5SLiqiang Tao       if (CalleeWasDeleted)
315*6cad45d5SLiqiang Tao         Advice->recordInliningWithCalleeDeleted();
316*6cad45d5SLiqiang Tao       else
317*6cad45d5SLiqiang Tao         Advice->recordInlining();
318*6cad45d5SLiqiang Tao     }
319*6cad45d5SLiqiang Tao 
320*6cad45d5SLiqiang Tao     if (!DidInline)
321*6cad45d5SLiqiang Tao       continue;
322*6cad45d5SLiqiang Tao     Changed = true;
323*6cad45d5SLiqiang Tao 
324*6cad45d5SLiqiang Tao     InlinedCallees.clear();
325*6cad45d5SLiqiang Tao   }
326*6cad45d5SLiqiang Tao 
327*6cad45d5SLiqiang Tao   // Now that we've finished inlining all of the calls across this module,
328*6cad45d5SLiqiang Tao   // delete all of the trivially dead functions.
329*6cad45d5SLiqiang Tao   //
330*6cad45d5SLiqiang Tao   // Note that this walks a pointer set which has non-deterministic order but
331*6cad45d5SLiqiang Tao   // that is OK as all we do is delete things and add pointers to unordered
332*6cad45d5SLiqiang Tao   // sets.
333*6cad45d5SLiqiang Tao   for (Function *DeadF : DeadFunctions) {
334*6cad45d5SLiqiang Tao     // Clear out any cached analyses.
335*6cad45d5SLiqiang Tao     FAM.clear(*DeadF, DeadF->getName());
336*6cad45d5SLiqiang Tao 
337*6cad45d5SLiqiang Tao     // And delete the actual function from the module.
338*6cad45d5SLiqiang Tao     // The Advisor may use Function pointers to efficiently index various
339*6cad45d5SLiqiang Tao     // internal maps, e.g. for memoization. Function cleanup passes like
340*6cad45d5SLiqiang Tao     // argument promotion create new functions. It is possible for a new
341*6cad45d5SLiqiang Tao     // function to be allocated at the address of a deleted function. We could
342*6cad45d5SLiqiang Tao     // index using names, but that's inefficient. Alternatively, we let the
343*6cad45d5SLiqiang Tao     // Advisor free the functions when it sees fit.
344*6cad45d5SLiqiang Tao     DeadF->getBasicBlockList().clear();
345*6cad45d5SLiqiang Tao     M.getFunctionList().remove(DeadF);
346*6cad45d5SLiqiang Tao 
347*6cad45d5SLiqiang Tao     ++NumDeleted;
348*6cad45d5SLiqiang Tao   }
349*6cad45d5SLiqiang Tao 
350*6cad45d5SLiqiang Tao   if (!Changed)
351*6cad45d5SLiqiang Tao     return PreservedAnalyses::all();
352*6cad45d5SLiqiang Tao 
353*6cad45d5SLiqiang Tao   return PreservedAnalyses::none();
354*6cad45d5SLiqiang Tao }
355