blob: baef3086f7d4fa9a9f28cfadd8356064e422c03f [file] [log] [blame]
Chris Lattner7d30a6c2004-06-20 04:11:48 +00001//===- Inliner.cpp - Code common to all inliners --------------------------===//
Misha Brukmanb1c93172005-04-21 23:48:37 +00002//
John Criswell482202a2003-10-20 19:43:21 +00003// The LLVM Compiler Infrastructure
4//
Chris Lattnerf3ebc3f2007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Misha Brukmanb1c93172005-04-21 23:48:37 +00007//
John Criswell482202a2003-10-20 19:43:21 +00008//===----------------------------------------------------------------------===//
Chris Lattnerd075cc22003-08-31 19:10:30 +00009//
Chris Lattner6754b822004-05-23 21:22:17 +000010// This file implements the mechanics required to implement inlining without
11// missing any calls and updating the call graph. The decisions of which calls
12// are profitable to inline are implemented elsewhere.
Chris Lattnerd075cc22003-08-31 19:10:30 +000013//
14//===----------------------------------------------------------------------===//
15
Chandler Carruth1d963112016-12-20 03:15:32 +000016#include "llvm/Transforms/IPO/Inliner.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000017#include "llvm/ADT/SmallPtrSet.h"
18#include "llvm/ADT/Statistic.h"
Hal Finkel0c083022014-09-01 09:01:39 +000019#include "llvm/Analysis/AliasAnalysis.h"
Daniel Jasperaec2fa32016-12-19 08:22:17 +000020#include "llvm/Analysis/AssumptionCache.h"
Chandler Carruth7b560d42015-09-09 17:55:00 +000021#include "llvm/Analysis/BasicAliasAnalysis.h"
Chris Lattnerd075cc22003-08-31 19:10:30 +000022#include "llvm/Analysis/CallGraph.h"
Dan Gohman4552e3c2009-10-13 18:30:07 +000023#include "llvm/Analysis/InlineCost.h"
Adam Nemet896c09b2016-08-10 00:44:44 +000024#include "llvm/Analysis/OptimizationDiagnosticInfo.h"
Easwaran Raman71069cf2016-06-09 22:23:21 +000025#include "llvm/Analysis/ProfileSummaryInfo.h"
Benjamin Kramer799003b2015-03-23 19:32:43 +000026#include "llvm/Analysis/TargetLibraryInfo.h"
Chandler Carruth219b89b2014-03-04 11:01:28 +000027#include "llvm/IR/CallSite.h"
Chandler Carruth9fb823b2013-01-02 11:36:10 +000028#include "llvm/IR/DataLayout.h"
Diego Novilloa9298b22014-04-08 16:42:34 +000029#include "llvm/IR/DiagnosticInfo.h"
Chandler Carruth1d963112016-12-20 03:15:32 +000030#include "llvm/IR/InstIterator.h"
Chandler Carruth9fb823b2013-01-02 11:36:10 +000031#include "llvm/IR/Instructions.h"
32#include "llvm/IR/IntrinsicInst.h"
33#include "llvm/IR/Module.h"
Reid Spencer7c16caa2004-09-01 22:55:40 +000034#include "llvm/Support/Debug.h"
Daniel Dunbar0dd5e1e2009-07-25 00:23:56 +000035#include "llvm/Support/raw_ostream.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000036#include "llvm/Transforms/Utils/Cloning.h"
37#include "llvm/Transforms/Utils/Local.h"
Chris Lattnera82f1312003-11-21 21:45:31 +000038using namespace llvm;
Brian Gaeke960707c2003-11-11 22:41:34 +000039
Chandler Carruth964daaa2014-04-22 02:55:47 +000040#define DEBUG_TYPE "inline"
41
Chris Lattner1631bcb2006-12-19 22:09:18 +000042STATISTIC(NumInlined, "Number of functions inlined");
Chris Lattnerb49a6222010-05-01 17:19:38 +000043STATISTIC(NumCallsDeleted, "Number of call sites deleted, not inlined");
Chris Lattner1631bcb2006-12-19 22:09:18 +000044STATISTIC(NumDeleted, "Number of functions deleted because all callers found");
Chris Lattnerd3374e82009-08-27 06:29:33 +000045STATISTIC(NumMergedAllocas, "Number of allocas merged together");
Chris Lattner1631bcb2006-12-19 22:09:18 +000046
Benjamin Kramerbde91762012-06-02 10:20:22 +000047// This weirdly named statistic tracks the number of times that, when attempting
Chandler Carruth7ae90d42012-04-11 10:15:10 +000048// to inline a function A into B, we analyze the callers of B in order to see
49// if those would be more profitable and blocked inline steps.
50STATISTIC(NumCallerCallersAnalyzed, "Number of caller-callers analyzed");
51
Chandler Carruthf702d8e2016-08-17 02:40:23 +000052/// Flag to disable manual alloca merging.
53///
54/// Merging of allocas was originally done as a stack-size saving technique
55/// prior to LLVM's code generator having support for stack coloring based on
56/// lifetime markers. It is now in the process of being removed. To experiment
57/// with disabling it and relying fully on lifetime marker based stack
58/// coloring, you can pass this flag to LLVM.
59static cl::opt<bool>
60 DisableInlinedAllocaMerging("disable-inlined-alloca-merging",
61 cl::init(false), cl::Hidden);
62
Piotr Padlewski84abc742016-07-29 00:27:16 +000063namespace {
64enum class InlinerFunctionImportStatsOpts {
65 No = 0,
66 Basic = 1,
67 Verbose = 2,
68};
69
70cl::opt<InlinerFunctionImportStatsOpts> InlinerFunctionImportStats(
71 "inliner-function-import-stats",
72 cl::init(InlinerFunctionImportStatsOpts::No),
73 cl::values(clEnumValN(InlinerFunctionImportStatsOpts::Basic, "basic",
74 "basic statistics"),
75 clEnumValN(InlinerFunctionImportStatsOpts::Verbose, "verbose",
Mehdi Amini732afdd2016-10-08 19:41:06 +000076 "printing of statistics for each inlined function")),
Piotr Padlewski84abc742016-07-29 00:27:16 +000077 cl::Hidden, cl::desc("Enable inliner stats for imported functions"));
78} // namespace
79
Chandler Carruth1d963112016-12-20 03:15:32 +000080LegacyInlinerBase::LegacyInlinerBase(char &ID)
81 : CallGraphSCCPass(ID), InsertLifetime(true) {}
Chris Lattnerd075cc22003-08-31 19:10:30 +000082
Chandler Carruth1d963112016-12-20 03:15:32 +000083LegacyInlinerBase::LegacyInlinerBase(char &ID, bool InsertLifetime)
Easwaran Ramanb1bd3982016-03-08 00:36:35 +000084 : CallGraphSCCPass(ID), InsertLifetime(InsertLifetime) {}
Chris Lattner22ad7ab2008-01-12 06:49:13 +000085
Sanjay Patelf1b0db12015-03-10 16:42:24 +000086/// For this class, we declare that we require and preserve the call graph.
87/// If the derived class implements this method, it should
Chris Lattnerf94bed32007-01-30 23:28:39 +000088/// always explicitly call the implementation here.
Chandler Carruth1d963112016-12-20 03:15:32 +000089void LegacyInlinerBase::getAnalysisUsage(AnalysisUsage &AU) const {
Daniel Jasperaec2fa32016-12-19 08:22:17 +000090 AU.addRequired<AssumptionCacheTracker>();
Easwaran Raman71069cf2016-06-09 22:23:21 +000091 AU.addRequired<ProfileSummaryInfoWrapperPass>();
Chandler Carruth7b560d42015-09-09 17:55:00 +000092 AU.addRequired<TargetLibraryInfoWrapperPass>();
Chandler Carruth12884f72016-03-02 15:56:53 +000093 getAAResultsAnalysisUsage(AU);
Chandler Carruthe40e60e2012-12-27 11:17:15 +000094 CallGraphSCCPass::getAnalysisUsage(AU);
Chris Lattnerf94bed32007-01-30 23:28:39 +000095}
96
Chandler Carruth8562d3a2016-08-03 01:02:31 +000097typedef DenseMap<ArrayType *, std::vector<AllocaInst *>> InlinedArrayAllocasTy;
Chris Lattnerd3374e82009-08-27 06:29:33 +000098
Chandler Carruthf702d8e2016-08-17 02:40:23 +000099/// Look at all of the allocas that we inlined through this call site. If we
100/// have already inlined other allocas through other calls into this function,
101/// then we know that they have disjoint lifetimes and that we can merge them.
Chris Lattnerd3374e82009-08-27 06:29:33 +0000102///
Chandler Carruthf702d8e2016-08-17 02:40:23 +0000103/// There are many heuristics possible for merging these allocas, and the
104/// different options have different tradeoffs. One thing that we *really*
105/// don't want to hurt is SRoA: once inlining happens, often allocas are no
106/// longer address taken and so they can be promoted.
107///
108/// Our "solution" for that is to only merge allocas whose outermost type is an
109/// array type. These are usually not promoted because someone is using a
110/// variable index into them. These are also often the most important ones to
111/// merge.
112///
113/// A better solution would be to have real memory lifetime markers in the IR
114/// and not have the inliner do any merging of allocas at all. This would
115/// allow the backend to do proper stack slot coloring of all allocas that
116/// *actually make it to the backend*, which is really what we want.
117///
118/// Because we don't have this information, we do this simple and useful hack.
119static void mergeInlinedArrayAllocas(
120 Function *Caller, InlineFunctionInfo &IFI,
121 InlinedArrayAllocasTy &InlinedArrayAllocas, int InlineHistory) {
Chandler Carruth8562d3a2016-08-03 01:02:31 +0000122 SmallPtrSet<AllocaInst *, 16> UsedAllocas;
123
Chris Lattnerfb212de2010-12-06 07:52:42 +0000124 // When processing our SCC, check to see if CS was inlined from some other
125 // call site. For example, if we're processing "A" in this code:
126 // A() { B() }
127 // B() { x = alloca ... C() }
128 // C() { y = alloca ... }
129 // Assume that C was not inlined into B initially, and so we're processing A
130 // and decide to inline B into A. Doing this makes an alloca available for
131 // reuse and makes a callsite (C) available for inlining. When we process
132 // the C call site we don't want to do any alloca merging between X and Y
133 // because their scopes are not disjoint. We could make this smarter by
134 // keeping track of the inline history for each alloca in the
135 // InlinedArrayAllocas but this isn't likely to be a significant win.
Chandler Carruth8562d3a2016-08-03 01:02:31 +0000136 if (InlineHistory != -1) // Only do merging for top-level call sites in SCC.
Chandler Carruthf702d8e2016-08-17 02:40:23 +0000137 return;
Chandler Carruth8562d3a2016-08-03 01:02:31 +0000138
Chris Lattnerd3374e82009-08-27 06:29:33 +0000139 // Loop over all the allocas we have so far and see if they can be merged with
140 // a previously inlined alloca. If not, remember that we had it.
Chandler Carruth8562d3a2016-08-03 01:02:31 +0000141 for (unsigned AllocaNo = 0, e = IFI.StaticAllocas.size(); AllocaNo != e;
142 ++AllocaNo) {
Chris Lattner4ba01ec2010-04-22 23:07:58 +0000143 AllocaInst *AI = IFI.StaticAllocas[AllocaNo];
Chandler Carruth8562d3a2016-08-03 01:02:31 +0000144
Chris Lattnerd3374e82009-08-27 06:29:33 +0000145 // Don't bother trying to merge array allocations (they will usually be
146 // canonicalized to be an allocation *of* an array), or allocations whose
147 // type is not itself an array (because we're afraid of pessimizing SRoA).
Chris Lattner229907c2011-07-18 04:54:35 +0000148 ArrayType *ATy = dyn_cast<ArrayType>(AI->getAllocatedType());
Craig Topperf40110f2014-04-25 05:29:35 +0000149 if (!ATy || AI->isArrayAllocation())
Chris Lattnerd3374e82009-08-27 06:29:33 +0000150 continue;
Chandler Carruth8562d3a2016-08-03 01:02:31 +0000151
Chris Lattnerd3374e82009-08-27 06:29:33 +0000152 // Get the list of all available allocas for this array type.
Chandler Carruth8562d3a2016-08-03 01:02:31 +0000153 std::vector<AllocaInst *> &AllocasForType = InlinedArrayAllocas[ATy];
154
Chris Lattnerd3374e82009-08-27 06:29:33 +0000155 // Loop over the allocas in AllocasForType to see if we can reuse one. Note
156 // that we have to be careful not to reuse the same "available" alloca for
157 // multiple different allocas that we just inlined, we use the 'UsedAllocas'
158 // set to keep track of which "available" allocas are being used by this
159 // function. Also, AllocasForType can be empty of course!
160 bool MergedAwayAlloca = false;
Yaron Keren62064d62015-06-25 19:28:24 +0000161 for (AllocaInst *AvailableAlloca : AllocasForType) {
Hal Finkel9caa8f72013-07-16 17:10:55 +0000162
163 unsigned Align1 = AI->getAlignment(),
164 Align2 = AvailableAlloca->getAlignment();
Chandler Carruth8562d3a2016-08-03 01:02:31 +0000165
Chris Lattnerd3374e82009-08-27 06:29:33 +0000166 // The available alloca has to be in the right function, not in some other
167 // function in this SCC.
168 if (AvailableAlloca->getParent() != AI->getParent())
169 continue;
Chandler Carruth8562d3a2016-08-03 01:02:31 +0000170
Chris Lattnerd3374e82009-08-27 06:29:33 +0000171 // If the inlined function already uses this alloca then we can't reuse
172 // it.
David Blaikie70573dc2014-11-19 07:49:26 +0000173 if (!UsedAllocas.insert(AvailableAlloca).second)
Chris Lattnerd3374e82009-08-27 06:29:33 +0000174 continue;
Chandler Carruth8562d3a2016-08-03 01:02:31 +0000175
Chris Lattnerd3374e82009-08-27 06:29:33 +0000176 // Otherwise, we *can* reuse it, RAUW AI into AvailableAlloca and declare
177 // success!
Chandler Carruth8562d3a2016-08-03 01:02:31 +0000178 DEBUG(dbgs() << " ***MERGED ALLOCA: " << *AI
179 << "\n\t\tINTO: " << *AvailableAlloca << '\n');
180
Evgeniy Stepanovd8b86f72015-09-29 00:30:19 +0000181 // Move affected dbg.declare calls immediately after the new alloca to
Simon Pilgrim7d18a702016-11-20 13:19:49 +0000182 // avoid the situation when a dbg.declare precedes its alloca.
Evgeniy Stepanovd8b86f72015-09-29 00:30:19 +0000183 if (auto *L = LocalAsMetadata::getIfExists(AI))
184 if (auto *MDV = MetadataAsValue::getIfExists(AI->getContext(), L))
185 for (User *U : MDV->users())
186 if (DbgDeclareInst *DDI = dyn_cast<DbgDeclareInst>(U))
187 DDI->moveBefore(AvailableAlloca->getNextNode());
188
Chris Lattnerd3374e82009-08-27 06:29:33 +0000189 AI->replaceAllUsesWith(AvailableAlloca);
Hal Finkel9caa8f72013-07-16 17:10:55 +0000190
Hal Finkelec7cd262013-07-17 14:32:41 +0000191 if (Align1 != Align2) {
192 if (!Align1 || !Align2) {
Mehdi Amini46a43552015-03-04 18:43:29 +0000193 const DataLayout &DL = Caller->getParent()->getDataLayout();
194 unsigned TypeAlign = DL.getABITypeAlignment(AI->getAllocatedType());
Hal Finkelec7cd262013-07-17 14:32:41 +0000195
196 Align1 = Align1 ? Align1 : TypeAlign;
197 Align2 = Align2 ? Align2 : TypeAlign;
198 }
199
200 if (Align1 > Align2)
201 AvailableAlloca->setAlignment(AI->getAlignment());
202 }
Hal Finkel9caa8f72013-07-16 17:10:55 +0000203
Chris Lattnerd3374e82009-08-27 06:29:33 +0000204 AI->eraseFromParent();
205 MergedAwayAlloca = true;
206 ++NumMergedAllocas;
Craig Topperf40110f2014-04-25 05:29:35 +0000207 IFI.StaticAllocas[AllocaNo] = nullptr;
Chris Lattnerd3374e82009-08-27 06:29:33 +0000208 break;
209 }
Misha Brukmanb1c93172005-04-21 23:48:37 +0000210
Chris Lattnerd3374e82009-08-27 06:29:33 +0000211 // If we already nuked the alloca, we're done with it.
212 if (MergedAwayAlloca)
213 continue;
Chandler Carruth8562d3a2016-08-03 01:02:31 +0000214
Chris Lattnerd3374e82009-08-27 06:29:33 +0000215 // If we were unable to merge away the alloca either because there are no
216 // allocas of the right type available or because we reused them all
217 // already, remember that this alloca came from an inlined function and mark
218 // it used so we don't reuse it for other allocas from this inline
219 // operation.
220 AllocasForType.push_back(AI);
221 UsedAllocas.insert(AI);
Chris Lattner6754b822004-05-23 21:22:17 +0000222 }
Chandler Carruthf702d8e2016-08-17 02:40:23 +0000223}
224
225/// If it is possible to inline the specified call site,
226/// do so and update the CallGraph for this operation.
227///
228/// This function also does some basic book-keeping to update the IR. The
229/// InlinedArrayAllocas map keeps track of any allocas that are already
230/// available from other functions inlined into the caller. If we are able to
231/// inline this call site we attempt to reuse already available allocas or add
232/// any new allocas to the set if not possible.
233static bool InlineCallIfPossible(
234 CallSite CS, InlineFunctionInfo &IFI,
235 InlinedArrayAllocasTy &InlinedArrayAllocas, int InlineHistory,
236 bool InsertLifetime, function_ref<AAResults &(Function &)> &AARGetter,
237 ImportedFunctionsInliningStatistics &ImportedFunctionsStats) {
238 Function *Callee = CS.getCalledFunction();
239 Function *Caller = CS.getCaller();
240
241 AAResults &AAR = AARGetter(*Callee);
242
243 // Try to inline the function. Get the list of static allocas that were
244 // inlined.
245 if (!InlineFunction(CS, IFI, &AAR, InsertLifetime))
246 return false;
247
248 if (InlinerFunctionImportStats != InlinerFunctionImportStatsOpts::No)
249 ImportedFunctionsStats.recordInline(*Caller, *Callee);
250
251 AttributeFuncs::mergeAttributesForInlining(*Caller, *Callee);
252
253 if (!DisableInlinedAllocaMerging)
254 mergeInlinedArrayAllocas(Caller, IFI, InlinedArrayAllocas, InlineHistory);
Chandler Carruth8562d3a2016-08-03 01:02:31 +0000255
Chris Lattner6754b822004-05-23 21:22:17 +0000256 return true;
Chris Lattnerd075cc22003-08-31 19:10:30 +0000257}
Jakob Stoklund Olesen8a19d3c2010-01-20 17:51:28 +0000258
Sean Silvaab6a6832016-07-23 04:22:50 +0000259/// Return true if inlining of CS can block the caller from being
260/// inlined which is proved to be more beneficial. \p IC is the
261/// estimated inline cost associated with callsite \p CS.
262/// \p TotalAltCost will be set to the estimated cost of inlining the caller
263/// if \p CS is suppressed for inlining.
264static bool
265shouldBeDeferred(Function *Caller, CallSite CS, InlineCost IC,
266 int &TotalSecondaryCost,
Benjamin Kramer41e66da2016-08-06 12:33:46 +0000267 function_ref<InlineCost(CallSite CS)> GetInlineCost) {
Xinliang David Li4b2fdcc2016-04-29 22:59:36 +0000268
269 // For now we only handle local or inline functions.
270 if (!Caller->hasLocalLinkage() && !Caller->hasLinkOnceODRLinkage())
271 return false;
272 // Try to detect the case where the current inlining candidate caller (call
273 // it B) is a static or linkonce-ODR function and is an inlining candidate
274 // elsewhere, and the current candidate callee (call it C) is large enough
275 // that inlining it into B would make B too big to inline later. In these
276 // circumstances it may be best not to inline C into B, but to inline B into
277 // its callers.
278 //
279 // This only applies to static and linkonce-ODR functions because those are
280 // expected to be available for inlining in the translation units where they
281 // are used. Thus we will always have the opportunity to make local inlining
282 // decisions. Importantly the linkonce-ODR linkage covers inline functions
283 // and templates in C++.
284 //
285 // FIXME: All of this logic should be sunk into getInlineCost. It relies on
286 // the internal implementation of the inline cost metrics rather than
287 // treating them as truly abstract units etc.
288 TotalSecondaryCost = 0;
289 // The candidate cost to be imposed upon the current function.
290 int CandidateCost = IC.getCost() - (InlineConstants::CallPenalty + 1);
291 // This bool tracks what happens if we do NOT inline C into B.
292 bool callerWillBeRemoved = Caller->hasLocalLinkage();
293 // This bool tracks what happens if we DO inline C into B.
294 bool inliningPreventsSomeOuterInline = false;
295 for (User *U : Caller->users()) {
296 CallSite CS2(U);
297
298 // If this isn't a call to Caller (it could be some other sort
299 // of reference) skip it. Such references will prevent the caller
300 // from being removed.
301 if (!CS2 || CS2.getCalledFunction() != Caller) {
302 callerWillBeRemoved = false;
303 continue;
304 }
305
Sean Silvaab6a6832016-07-23 04:22:50 +0000306 InlineCost IC2 = GetInlineCost(CS2);
Xinliang David Li4b2fdcc2016-04-29 22:59:36 +0000307 ++NumCallerCallersAnalyzed;
308 if (!IC2) {
309 callerWillBeRemoved = false;
310 continue;
311 }
312 if (IC2.isAlways())
313 continue;
314
Xinliang David Lif450b882016-11-04 03:00:52 +0000315 // See if inlining of the original callsite would erase the cost delta of
Xinliang David Li4b2fdcc2016-04-29 22:59:36 +0000316 // this callsite. We subtract off the penalty for the call instruction,
317 // which we would be deleting.
318 if (IC2.getCostDelta() <= CandidateCost) {
319 inliningPreventsSomeOuterInline = true;
320 TotalSecondaryCost += IC2.getCost();
321 }
322 }
323 // If all outer calls to Caller would get inlined, the cost for the last
324 // one is set very low by getInlineCost, in anticipation that Caller will
325 // be removed entirely. We did not account for this above unless there
326 // is only one caller of Caller.
327 if (callerWillBeRemoved && !Caller->use_empty())
Piotr Padlewskid89875c2016-08-10 21:15:22 +0000328 TotalSecondaryCost -= InlineConstants::LastCallToStaticBonus;
Xinliang David Li4b2fdcc2016-04-29 22:59:36 +0000329
330 if (inliningPreventsSomeOuterInline && TotalSecondaryCost < IC.getCost())
331 return true;
332
333 return false;
334}
335
Sanjay Patelf1b0db12015-03-10 16:42:24 +0000336/// Return true if the inliner should attempt to inline at the given CallSite.
Sean Silvaab6a6832016-07-23 04:22:50 +0000337static bool shouldInline(CallSite CS,
Adam Nemet896c09b2016-08-10 00:44:44 +0000338 function_ref<InlineCost(CallSite CS)> GetInlineCost,
339 OptimizationRemarkEmitter &ORE) {
Adam Nemetc507ac92016-09-27 23:47:03 +0000340 using namespace ore;
Sean Silvaab6a6832016-07-23 04:22:50 +0000341 InlineCost IC = GetInlineCost(CS);
Adam Nemetc507ac92016-09-27 23:47:03 +0000342 Instruction *Call = CS.getInstruction();
343 Function *Callee = CS.getCalledFunction();
Chandler Carruth8562d3a2016-08-03 01:02:31 +0000344
Daniel Dunbar3933e662008-10-30 19:26:59 +0000345 if (IC.isAlways()) {
David Greene0122fc42010-01-05 01:27:51 +0000346 DEBUG(dbgs() << " Inlining: cost=always"
Chandler Carruth8562d3a2016-08-03 01:02:31 +0000347 << ", Call: " << *CS.getInstruction() << "\n");
Adam Nemetc507ac92016-09-27 23:47:03 +0000348 ORE.emit(OptimizationRemarkAnalysis(DEBUG_TYPE, "AlwaysInline", Call)
349 << NV("Callee", Callee)
350 << " should always be inlined (cost=always)");
Daniel Dunbar3933e662008-10-30 19:26:59 +0000351 return true;
352 }
Chandler Carruth8562d3a2016-08-03 01:02:31 +0000353
Daniel Dunbar3933e662008-10-30 19:26:59 +0000354 if (IC.isNever()) {
David Greene0122fc42010-01-05 01:27:51 +0000355 DEBUG(dbgs() << " NOT Inlining: cost=never"
Chandler Carruth8562d3a2016-08-03 01:02:31 +0000356 << ", Call: " << *CS.getInstruction() << "\n");
Adam Nemetc507ac92016-09-27 23:47:03 +0000357 ORE.emit(OptimizationRemarkAnalysis(DEBUG_TYPE, "NeverInline", Call)
358 << NV("Callee", Callee)
359 << " should never be inlined (cost=never)");
Daniel Dunbar3933e662008-10-30 19:26:59 +0000360 return false;
361 }
Chandler Carruth8562d3a2016-08-03 01:02:31 +0000362
Dale Johannesen30599242009-10-09 00:11:32 +0000363 Function *Caller = CS.getCaller();
Chandler Carruth0539c072012-03-31 12:42:41 +0000364 if (!IC) {
365 DEBUG(dbgs() << " NOT Inlining: cost=" << IC.getCost()
Chandler Carruth8562d3a2016-08-03 01:02:31 +0000366 << ", thres=" << (IC.getCostDelta() + IC.getCost())
367 << ", Call: " << *CS.getInstruction() << "\n");
Adam Nemetc507ac92016-09-27 23:47:03 +0000368 ORE.emit(OptimizationRemarkAnalysis(DEBUG_TYPE, "TooCostly", Call)
369 << NV("Callee", Callee) << " too costly to inline (cost="
370 << NV("Cost", IC.getCost()) << ", threshold="
371 << NV("Threshold", IC.getCostDelta() + IC.getCost()) << ")");
Daniel Dunbare7fbf9f42008-10-29 01:02:02 +0000372 return false;
Daniel Dunbare7fbf9f42008-10-29 01:02:02 +0000373 }
Dale Johannesen30599242009-10-09 00:11:32 +0000374
Xinliang David Li4b2fdcc2016-04-29 22:59:36 +0000375 int TotalSecondaryCost = 0;
Sean Silvaab6a6832016-07-23 04:22:50 +0000376 if (shouldBeDeferred(Caller, CS, IC, TotalSecondaryCost, GetInlineCost)) {
Xinliang David Li4b2fdcc2016-04-29 22:59:36 +0000377 DEBUG(dbgs() << " NOT Inlining: " << *CS.getInstruction()
Chandler Carruth8562d3a2016-08-03 01:02:31 +0000378 << " Cost = " << IC.getCost()
379 << ", outer Cost = " << TotalSecondaryCost << '\n');
Adam Nemetc507ac92016-09-27 23:47:03 +0000380 ORE.emit(OptimizationRemarkAnalysis(DEBUG_TYPE,
381 "IncreaseCostInOtherContexts", Call)
382 << "Not inlining. Cost of inlining " << NV("Callee", Callee)
383 << " increases the cost of inlining " << NV("Caller", Caller)
384 << " in other contexts");
Xinliang David Li4b2fdcc2016-04-29 22:59:36 +0000385 return false;
Dale Johannesen30599242009-10-09 00:11:32 +0000386 }
387
Chandler Carruth0539c072012-03-31 12:42:41 +0000388 DEBUG(dbgs() << " Inlining: cost=" << IC.getCost()
Chandler Carruth8562d3a2016-08-03 01:02:31 +0000389 << ", thres=" << (IC.getCostDelta() + IC.getCost())
390 << ", Call: " << *CS.getInstruction() << '\n');
Adam Nemetc507ac92016-09-27 23:47:03 +0000391 ORE.emit(OptimizationRemarkAnalysis(DEBUG_TYPE, "CanBeInlined", Call)
392 << NV("Callee", Callee) << " can be inlined into "
393 << NV("Caller", Caller) << " with cost=" << NV("Cost", IC.getCost())
394 << " (threshold="
395 << NV("Threshold", IC.getCostDelta() + IC.getCost()) << ")");
Chris Lattner5eef6ad2009-08-27 03:51:50 +0000396 return true;
Daniel Dunbare7fbf9f42008-10-29 01:02:02 +0000397}
Chris Lattnerd075cc22003-08-31 19:10:30 +0000398
Sanjay Patelf1b0db12015-03-10 16:42:24 +0000399/// Return true if the specified inline history ID
Chris Lattnere8262672010-05-01 01:05:10 +0000400/// indicates an inline history that includes the specified function.
Chandler Carruth8562d3a2016-08-03 01:02:31 +0000401static bool InlineHistoryIncludes(
402 Function *F, int InlineHistoryID,
403 const SmallVectorImpl<std::pair<Function *, int>> &InlineHistory) {
Chris Lattnere8262672010-05-01 01:05:10 +0000404 while (InlineHistoryID != -1) {
405 assert(unsigned(InlineHistoryID) < InlineHistory.size() &&
406 "Invalid inline history ID");
407 if (InlineHistory[InlineHistoryID].first == F)
408 return true;
409 InlineHistoryID = InlineHistory[InlineHistoryID].second;
410 }
411 return false;
412}
413
Chandler Carruth1d963112016-12-20 03:15:32 +0000414bool LegacyInlinerBase::doInitialization(CallGraph &CG) {
Piotr Padlewski84abc742016-07-29 00:27:16 +0000415 if (InlinerFunctionImportStats != InlinerFunctionImportStatsOpts::No)
416 ImportedFunctionsStats.setModuleInfo(CG.getModule());
417 return false; // No changes to CallGraph.
418}
419
Chandler Carruth1d963112016-12-20 03:15:32 +0000420bool LegacyInlinerBase::runOnSCC(CallGraphSCC &SCC) {
Andrew Kayloraa641a52016-04-22 22:06:11 +0000421 if (skipSCC(SCC))
422 return false;
Andrew Kaylor9c81d0f2016-05-23 21:57:54 +0000423 return inlineCalls(SCC);
424}
Andrew Kayloraa641a52016-04-22 22:06:11 +0000425
Sean Silvaab6a6832016-07-23 04:22:50 +0000426static bool
427inlineCallsImpl(CallGraphSCC &SCC, CallGraph &CG,
Daniel Jasperaec2fa32016-12-19 08:22:17 +0000428 std::function<AssumptionCache &(Function &)> GetAssumptionCache,
Sean Silvaab6a6832016-07-23 04:22:50 +0000429 ProfileSummaryInfo *PSI, TargetLibraryInfo &TLI,
430 bool InsertLifetime,
Benjamin Kramer41e66da2016-08-06 12:33:46 +0000431 function_ref<InlineCost(CallSite CS)> GetInlineCost,
432 function_ref<AAResults &(Function &)> AARGetter,
Piotr Padlewski84abc742016-07-29 00:27:16 +0000433 ImportedFunctionsInliningStatistics &ImportedFunctionsStats) {
Chandler Carruth8562d3a2016-08-03 01:02:31 +0000434 SmallPtrSet<Function *, 8> SCCFunctions;
David Greene0122fc42010-01-05 01:27:51 +0000435 DEBUG(dbgs() << "Inliner visiting SCC:");
Yaron Keren4c548f22015-06-20 07:12:33 +0000436 for (CallGraphNode *Node : SCC) {
437 Function *F = Node->getFunction();
Chandler Carruth8562d3a2016-08-03 01:02:31 +0000438 if (F)
439 SCCFunctions.insert(F);
David Greene0122fc42010-01-05 01:27:51 +0000440 DEBUG(dbgs() << " " << (F ? F->getName() : "INDIRECTNODE"));
Chris Lattnerd075cc22003-08-31 19:10:30 +0000441 }
Chris Lattnerd075cc22003-08-31 19:10:30 +0000442
Chris Lattner6754b822004-05-23 21:22:17 +0000443 // Scan through and identify all call sites ahead of time so that we only
444 // inline call sites in the original functions, not call sites that result
445 // from inlining other functions.
Chris Lattnere8262672010-05-01 01:05:10 +0000446 SmallVector<std::pair<CallSite, int>, 16> CallSites;
Chandler Carruth8562d3a2016-08-03 01:02:31 +0000447
Chris Lattnere8262672010-05-01 01:05:10 +0000448 // When inlining a callee produces new call sites, we want to keep track of
449 // the fact that they were inlined from the callee. This allows us to avoid
450 // infinite inlining in some obscure cases. To represent this, we use an
451 // index into the InlineHistory vector.
Chandler Carruth8562d3a2016-08-03 01:02:31 +0000452 SmallVector<std::pair<Function *, int>, 8> InlineHistory;
Chris Lattner6754b822004-05-23 21:22:17 +0000453
Yaron Keren4c548f22015-06-20 07:12:33 +0000454 for (CallGraphNode *Node : SCC) {
455 Function *F = Node->getFunction();
Adam Nemetcef33142016-08-26 20:21:05 +0000456 if (!F || F->isDeclaration())
Chandler Carruth8562d3a2016-08-03 01:02:31 +0000457 continue;
458
Adam Nemetcef33142016-08-26 20:21:05 +0000459 OptimizationRemarkEmitter ORE(F);
Yaron Keren4c548f22015-06-20 07:12:33 +0000460 for (BasicBlock &BB : *F)
461 for (Instruction &I : BB) {
462 CallSite CS(cast<Value>(&I));
Dale Johannesen30599242009-10-09 00:11:32 +0000463 // If this isn't a call, or it is a call to an intrinsic, it can
Chris Lattner9e507472009-08-31 05:34:32 +0000464 // never be inlined.
Gabor Greif62f0aac2010-07-28 22:50:26 +0000465 if (!CS || isa<IntrinsicInst>(I))
Chris Lattner5eef6ad2009-08-27 03:51:50 +0000466 continue;
Chandler Carruth8562d3a2016-08-03 01:02:31 +0000467
Chris Lattner9e507472009-08-31 05:34:32 +0000468 // If this is a direct call to an external function, we can never inline
469 // it. If it is an indirect call, inlining may resolve it to be a
470 // direct call, so we keep it.
Yaron Kerenc66c06b2015-07-19 15:48:07 +0000471 if (Function *Callee = CS.getCalledFunction())
Adam Nemetcef33142016-08-26 20:21:05 +0000472 if (Callee->isDeclaration()) {
Adam Nemeta62b7e12016-09-27 20:55:07 +0000473 using namespace ore;
Adam Nemet04758ba2016-09-27 22:19:23 +0000474 ORE.emit(OptimizationRemarkMissed(DEBUG_TYPE, "NoDefinition", &I)
Adam Nemeta62b7e12016-09-27 20:55:07 +0000475 << NV("Callee", Callee) << " will not be inlined into "
Adam Nemet11421472016-09-27 21:58:17 +0000476 << NV("Caller", CS.getCaller())
477 << " because its definition is unavailable"
478 << setIsVerbose());
Yaron Kerenc66c06b2015-07-19 15:48:07 +0000479 continue;
Adam Nemetcef33142016-08-26 20:21:05 +0000480 }
Chandler Carruth8562d3a2016-08-03 01:02:31 +0000481
Chris Lattnere8262672010-05-01 01:05:10 +0000482 CallSites.push_back(std::make_pair(CS, -1));
Chris Lattner5eef6ad2009-08-27 03:51:50 +0000483 }
484 }
Chris Lattnerd075cc22003-08-31 19:10:30 +0000485
David Greene0122fc42010-01-05 01:27:51 +0000486 DEBUG(dbgs() << ": " << CallSites.size() << " call sites.\n");
Misha Brukmanb1c93172005-04-21 23:48:37 +0000487
Chris Lattnera5cdd5e2010-04-20 00:47:08 +0000488 // If there are no calls in this function, exit early.
489 if (CallSites.empty())
490 return false;
Yaron Keren6967cbb2015-07-02 14:25:09 +0000491
Chris Lattner6754b822004-05-23 21:22:17 +0000492 // Now that we have all of the call sites, move the ones to functions in the
493 // current SCC to the end of the list.
494 unsigned FirstCallInSCC = CallSites.size();
495 for (unsigned i = 0; i < FirstCallInSCC; ++i)
Chris Lattnere8262672010-05-01 01:05:10 +0000496 if (Function *F = CallSites[i].first.getCalledFunction())
Chris Lattner6754b822004-05-23 21:22:17 +0000497 if (SCCFunctions.count(F))
498 std::swap(CallSites[i--], CallSites[--FirstCallInSCC]);
Misha Brukmanb1c93172005-04-21 23:48:37 +0000499
Chris Lattnerd3374e82009-08-27 06:29:33 +0000500 InlinedArrayAllocasTy InlinedArrayAllocas;
Daniel Jasperaec2fa32016-12-19 08:22:17 +0000501 InlineFunctionInfo InlineInfo(&CG, &GetAssumptionCache);
Chandler Carruth66b31302015-01-04 12:03:27 +0000502
Chris Lattner6754b822004-05-23 21:22:17 +0000503 // Now that we have all of the call sites, loop over them and inline them if
504 // it looks profitable to do so.
505 bool Changed = false;
506 bool LocalChange;
507 do {
508 LocalChange = false;
509 // Iterate over the outer loop because inlining functions can cause indirect
510 // calls to become direct calls.
Yaron Keren4c548f22015-06-20 07:12:33 +0000511 // CallSites may be modified inside so ranged for loop can not be used.
Chris Lattner5eef6ad2009-08-27 03:51:50 +0000512 for (unsigned CSi = 0; CSi != CallSites.size(); ++CSi) {
Chris Lattnere8262672010-05-01 01:05:10 +0000513 CallSite CS = CallSites[CSi].first;
Chandler Carruth8562d3a2016-08-03 01:02:31 +0000514
Chris Lattner5eef6ad2009-08-27 03:51:50 +0000515 Function *Caller = CS.getCaller();
Chris Lattnereb9acbf2009-11-12 07:56:08 +0000516 Function *Callee = CS.getCalledFunction();
517
518 // If this call site is dead and it is to a readonly function, we should
519 // just delete the call instead of trying to inline it, regardless of
520 // size. This happens because IPSCCP propagates the result out of the
521 // call and then we're left with the dead call.
Chandler Carruth7b560d42015-09-09 17:55:00 +0000522 if (isInstructionTriviallyDead(CS.getInstruction(), &TLI)) {
Chandler Carruth8562d3a2016-08-03 01:02:31 +0000523 DEBUG(dbgs() << " -> Deleting dead call: " << *CS.getInstruction()
524 << "\n");
Chris Lattnereb9acbf2009-11-12 07:56:08 +0000525 // Update the call graph by deleting the edge from Callee to Caller.
526 CG[Caller]->removeCallEdgeFor(CS);
527 CS.getInstruction()->eraseFromParent();
528 ++NumCallsDeleted;
529 } else {
530 // We can only inline direct calls to non-declarations.
Chandler Carruth8562d3a2016-08-03 01:02:31 +0000531 if (!Callee || Callee->isDeclaration())
532 continue;
533
Eric Christopherea2820342010-07-13 18:27:13 +0000534 // If this call site was obtained by inlining another function, verify
Chris Lattnere8262672010-05-01 01:05:10 +0000535 // that the include path for the function did not include the callee
Chris Lattner5b6a8652010-12-06 07:38:40 +0000536 // itself. If so, we'd be recursively inlining the same function,
Chris Lattnere8262672010-05-01 01:05:10 +0000537 // which would provide the same callsites, which would cause us to
538 // infinitely inline.
539 int InlineHistoryID = CallSites[CSi].second;
540 if (InlineHistoryID != -1 &&
541 InlineHistoryIncludes(Callee, InlineHistoryID, InlineHistory))
542 continue;
Chandler Carruth8562d3a2016-08-03 01:02:31 +0000543
NAKAMURA Takumicd1fc4b2014-04-17 12:22:14 +0000544 // Get DebugLoc to report. CS will be invalid after Inliner.
545 DebugLoc DLoc = CS.getInstruction()->getDebugLoc();
Adam Nemet896c09b2016-08-10 00:44:44 +0000546 BasicBlock *Block = CS.getParent();
547 // FIXME for new PM: because of the old PM we currently generate ORE and
548 // in turn BFI on demand. With the new PM, the ORE dependency should
549 // just become a regular analysis dependency.
550 OptimizationRemarkEmitter ORE(Caller);
NAKAMURA Takumicd1fc4b2014-04-17 12:22:14 +0000551
Diego Novillo7f8af8b2014-05-22 14:19:46 +0000552 // If the policy determines that we should inline this function,
553 // try to do so.
Adam Nemetc507ac92016-09-27 23:47:03 +0000554 using namespace ore;
Adam Nemet896c09b2016-08-10 00:44:44 +0000555 if (!shouldInline(CS, GetInlineCost, ORE)) {
Adam Nemetc507ac92016-09-27 23:47:03 +0000556 ORE.emit(
557 OptimizationRemarkMissed(DEBUG_TYPE, "NotInlined", DLoc, Block)
558 << NV("Callee", Callee) << " will not be inlined into "
559 << NV("Caller", Caller));
Diego Novillo7f8af8b2014-05-22 14:19:46 +0000560 continue;
561 }
562
Chris Lattner2eee5d32010-04-22 23:37:35 +0000563 // Attempt to inline the function.
Sean Silvaab6a6832016-07-23 04:22:50 +0000564 if (!InlineCallIfPossible(CS, InlineInfo, InlinedArrayAllocas,
Piotr Padlewski84abc742016-07-29 00:27:16 +0000565 InlineHistoryID, InsertLifetime, AARGetter,
566 ImportedFunctionsStats)) {
Adam Nemetc507ac92016-09-27 23:47:03 +0000567 ORE.emit(
568 OptimizationRemarkMissed(DEBUG_TYPE, "NotInlined", DLoc, Block)
569 << NV("Callee", Callee) << " will not be inlined into "
570 << NV("Caller", Caller));
Chris Lattnereb9acbf2009-11-12 07:56:08 +0000571 continue;
Diego Novillo7f8af8b2014-05-22 14:19:46 +0000572 }
Chris Lattnereb9acbf2009-11-12 07:56:08 +0000573 ++NumInlined;
Diego Novilloa9298b22014-04-08 16:42:34 +0000574
575 // Report the inline decision.
Adam Nemetc507ac92016-09-27 23:47:03 +0000576 ORE.emit(OptimizationRemark(DEBUG_TYPE, "Inlined", DLoc, Block)
577 << NV("Callee", Callee) << " inlined into "
578 << NV("Caller", Caller));
Diego Novilloa9298b22014-04-08 16:42:34 +0000579
Chris Lattnerc2432b92010-05-01 01:26:13 +0000580 // If inlining this function gave us any new call sites, throw them
Chris Lattner2eee5d32010-04-22 23:37:35 +0000581 // onto our worklist to process. They are useful inline candidates.
Chris Lattnerc2432b92010-05-01 01:26:13 +0000582 if (!InlineInfo.InlinedCalls.empty()) {
Chris Lattnere8262672010-05-01 01:05:10 +0000583 // Create a new inline history entry for this, so that we remember
584 // that these new callsites came about due to inlining Callee.
585 int NewHistoryID = InlineHistory.size();
586 InlineHistory.push_back(std::make_pair(Callee, InlineHistoryID));
587
Yaron Keren4c548f22015-06-20 07:12:33 +0000588 for (Value *Ptr : InlineInfo.InlinedCalls)
Chandler Carruth21211992012-03-25 04:03:40 +0000589 CallSites.push_back(std::make_pair(CallSite(Ptr), NewHistoryID));
Chris Lattnerc691de32010-04-23 18:37:01 +0000590 }
Chris Lattnereb9acbf2009-11-12 07:56:08 +0000591 }
Chandler Carruth8562d3a2016-08-03 01:02:31 +0000592
Chris Lattnereb9acbf2009-11-12 07:56:08 +0000593 // If we inlined or deleted the last possible call site to the function,
594 // delete the function body now.
595 if (Callee && Callee->use_empty() && Callee->hasLocalLinkage() &&
Chris Lattner9e507472009-08-31 05:34:32 +0000596 // TODO: Can remove if in SCC now.
Chris Lattner081375b2009-08-31 03:15:49 +0000597 !SCCFunctions.count(Callee) &&
Chandler Carruth8562d3a2016-08-03 01:02:31 +0000598
Chris Lattner081375b2009-08-31 03:15:49 +0000599 // The function may be apparently dead, but if there are indirect
600 // callgraph references to the node, we cannot delete it yet, this
601 // could invalidate the CGSCC iterator.
602 CG[Callee]->getNumReferences() == 0) {
Chandler Carruth8562d3a2016-08-03 01:02:31 +0000603 DEBUG(dbgs() << " -> Deleting dead function: " << Callee->getName()
604 << "\n");
Chris Lattnerd3374e82009-08-27 06:29:33 +0000605 CallGraphNode *CalleeNode = CG[Callee];
Yaron Keren6967cbb2015-07-02 14:25:09 +0000606
Chris Lattnerd3374e82009-08-27 06:29:33 +0000607 // Remove any call graph edges from the callee to its callees.
608 CalleeNode->removeAllCalledFunctions();
Chandler Carruth8562d3a2016-08-03 01:02:31 +0000609
Chris Lattnerd3374e82009-08-27 06:29:33 +0000610 // Removing the node for callee from the call graph and delete it.
Easwaran Ramanb1bd3982016-03-08 00:36:35 +0000611 delete CG.removeFunctionFromModule(CalleeNode);
Chris Lattnerd3374e82009-08-27 06:29:33 +0000612 ++NumDeleted;
613 }
Chris Lattner5eef6ad2009-08-27 03:51:50 +0000614
Chandler Carruth8562d3a2016-08-03 01:02:31 +0000615 // Remove this call site from the list. If possible, use
Chris Lattner5eef6ad2009-08-27 03:51:50 +0000616 // swap/pop_back for efficiency, but do not use it if doing so would
617 // move a call site to a function in this SCC before the
618 // 'FirstCallInSCC' barrier.
Chris Lattner4422d312010-04-16 22:42:17 +0000619 if (SCC.isSingular()) {
Benjamin Kramer5ac57e32010-05-31 12:50:41 +0000620 CallSites[CSi] = CallSites.back();
Chris Lattner5eef6ad2009-08-27 03:51:50 +0000621 CallSites.pop_back();
622 } else {
Chandler Carruth8562d3a2016-08-03 01:02:31 +0000623 CallSites.erase(CallSites.begin() + CSi);
Chris Lattner5eef6ad2009-08-27 03:51:50 +0000624 }
625 --CSi;
626
Chris Lattner5eef6ad2009-08-27 03:51:50 +0000627 Changed = true;
628 LocalChange = true;
629 }
Chris Lattner6754b822004-05-23 21:22:17 +0000630 } while (LocalChange);
Chris Lattner4d25c862004-04-08 06:34:31 +0000631
Chris Lattnerd075cc22003-08-31 19:10:30 +0000632 return Changed;
633}
634
Chandler Carruth1d963112016-12-20 03:15:32 +0000635bool LegacyInlinerBase::inlineCalls(CallGraphSCC &SCC) {
Sean Silvaab6a6832016-07-23 04:22:50 +0000636 CallGraph &CG = getAnalysis<CallGraphWrapperPass>().getCallGraph();
Daniel Jasperaec2fa32016-12-19 08:22:17 +0000637 ACT = &getAnalysis<AssumptionCacheTracker>();
Dehao Chen5461d8b2016-09-28 21:00:58 +0000638 PSI = getAnalysis<ProfileSummaryInfoWrapperPass>().getPSI();
Sean Silvaab6a6832016-07-23 04:22:50 +0000639 auto &TLI = getAnalysis<TargetLibraryInfoWrapperPass>().getTLI();
640 // We compute dedicated AA results for each function in the SCC as needed. We
641 // use a lambda referencing external objects so that they live long enough to
642 // be queried, but we re-use them each time.
643 Optional<BasicAAResult> BAR;
644 Optional<AAResults> AAR;
645 auto AARGetter = [&](Function &F) -> AAResults & {
646 BAR.emplace(createLegacyPMBasicAAResult(*this, F));
647 AAR.emplace(createLegacyPMAAResults(*this, F, *BAR));
648 return *AAR;
649 };
Daniel Jasperaec2fa32016-12-19 08:22:17 +0000650 auto GetAssumptionCache = [&](Function &F) -> AssumptionCache & {
651 return ACT->getAssumptionCache(F);
652 };
653 return inlineCallsImpl(SCC, CG, GetAssumptionCache, PSI, TLI, InsertLifetime,
Sean Silvaab6a6832016-07-23 04:22:50 +0000654 [this](CallSite CS) { return getInlineCost(CS); },
Piotr Padlewski84abc742016-07-29 00:27:16 +0000655 AARGetter, ImportedFunctionsStats);
Sean Silvaab6a6832016-07-23 04:22:50 +0000656}
657
Sanjay Patelf1b0db12015-03-10 16:42:24 +0000658/// Remove now-dead linkonce functions at the end of
659/// processing to avoid breaking the SCC traversal.
Chandler Carruth1d963112016-12-20 03:15:32 +0000660bool LegacyInlinerBase::doFinalization(CallGraph &CG) {
Piotr Padlewski84abc742016-07-29 00:27:16 +0000661 if (InlinerFunctionImportStats != InlinerFunctionImportStatsOpts::No)
662 ImportedFunctionsStats.dump(InlinerFunctionImportStats ==
663 InlinerFunctionImportStatsOpts::Verbose);
Devang Patelf0ef3572008-11-05 01:39:16 +0000664 return removeDeadFunctions(CG);
665}
666
Sanjay Patelf1b0db12015-03-10 16:42:24 +0000667/// Remove dead functions that are not included in DNR (Do Not Remove) list.
Chandler Carruth1d963112016-12-20 03:15:32 +0000668bool LegacyInlinerBase::removeDeadFunctions(CallGraph &CG,
669 bool AlwaysInlineOnly) {
Chandler Carruth8562d3a2016-08-03 01:02:31 +0000670 SmallVector<CallGraphNode *, 16> FunctionsToRemove;
David Majnemerac256cf2015-05-05 20:14:22 +0000671 SmallVector<CallGraphNode *, 16> DeadFunctionsInComdats;
672 SmallDenseMap<const Comdat *, int, 16> ComdatEntriesAlive;
673
674 auto RemoveCGN = [&](CallGraphNode *CGN) {
675 // Remove any call graph edges from the function to its callees.
676 CGN->removeAllCalledFunctions();
677
678 // Remove any edges from the external node to the function's call graph
679 // node. These edges might have been made irrelegant due to
680 // optimization of the program.
681 CG.getExternalCallingNode()->removeAnyCallEdgeTo(CGN);
682
683 // Removing the node for callee from the call graph and delete it.
684 FunctionsToRemove.push_back(CGN);
685 };
Chris Lattnerbe8bb802004-04-21 20:44:33 +0000686
687 // Scan for all of the functions, looking for ones that should now be removed
688 // from the program. Insert the dead ones in the FunctionsToRemove set.
David Blaikiea5d7de92015-08-05 20:55:50 +0000689 for (const auto &I : CG) {
690 CallGraphNode *CGN = I.second.get();
Chris Lattner5eef6ad2009-08-27 03:51:50 +0000691 Function *F = CGN->getFunction();
Chandler Carruthd7a5f2a2012-03-16 06:10:13 +0000692 if (!F || F->isDeclaration())
693 continue;
694
695 // Handle the case when this function is called and we only want to care
696 // about always-inline functions. This is a bit of a hack to share code
697 // between here and the InlineAlways pass.
Duncan P. N. Exon Smith2c79ad92015-02-14 01:11:29 +0000698 if (AlwaysInlineOnly && !F->hasFnAttribute(Attribute::AlwaysInline))
Chandler Carruthd7a5f2a2012-03-16 06:10:13 +0000699 continue;
700
Chris Lattner5eef6ad2009-08-27 03:51:50 +0000701 // If the only remaining users of the function are dead constants, remove
702 // them.
703 F->removeDeadConstantUsers();
Chris Lattnerbe8bb802004-04-21 20:44:33 +0000704
Eli Friedman1923a332011-10-20 05:23:42 +0000705 if (!F->isDefTriviallyDead())
Chris Lattner5eef6ad2009-08-27 03:51:50 +0000706 continue;
David Majnemerac077032014-10-08 19:32:32 +0000707
708 // It is unsafe to drop a function with discardable linkage from a COMDAT
709 // without also dropping the other members of the COMDAT.
710 // The inliner doesn't visit non-function entities which are in COMDAT
711 // groups so it is unsafe to do so *unless* the linkage is local.
David Majnemerac256cf2015-05-05 20:14:22 +0000712 if (!F->hasLocalLinkage()) {
713 if (const Comdat *C = F->getComdat()) {
714 --ComdatEntriesAlive[C];
715 DeadFunctionsInComdats.push_back(CGN);
716 continue;
717 }
718 }
Devang Patelf0ef3572008-11-05 01:39:16 +0000719
David Majnemerac256cf2015-05-05 20:14:22 +0000720 RemoveCGN(CGN);
Chris Lattnerc87784f2004-04-20 22:06:53 +0000721 }
David Majnemerac256cf2015-05-05 20:14:22 +0000722 if (!DeadFunctionsInComdats.empty()) {
723 // Count up all the entities in COMDAT groups
724 auto ComdatGroupReferenced = [&](const Comdat *C) {
725 auto I = ComdatEntriesAlive.find(C);
726 if (I != ComdatEntriesAlive.end())
727 ++(I->getSecond());
728 };
729 for (const Function &F : CG.getModule())
730 if (const Comdat *C = F.getComdat())
731 ComdatGroupReferenced(C);
732 for (const GlobalVariable &GV : CG.getModule().globals())
733 if (const Comdat *C = GV.getComdat())
734 ComdatGroupReferenced(C);
735 for (const GlobalAlias &GA : CG.getModule().aliases())
736 if (const Comdat *C = GA.getComdat())
737 ComdatGroupReferenced(C);
738 for (CallGraphNode *CGN : DeadFunctionsInComdats) {
739 Function *F = CGN->getFunction();
740 const Comdat *C = F->getComdat();
741 int NumAlive = ComdatEntriesAlive[C];
742 // We can remove functions in a COMDAT group if the entire group is dead.
743 assert(NumAlive >= 0);
744 if (NumAlive > 0)
745 continue;
746
747 RemoveCGN(CGN);
748 }
749 }
750
Chandler Carruthd7a5f2a2012-03-16 06:10:13 +0000751 if (FunctionsToRemove.empty())
752 return false;
Chris Lattnerbe8bb802004-04-21 20:44:33 +0000753
754 // Now that we know which functions to delete, do so. We didn't want to do
755 // this inline, because that would invalidate our CallGraph::iterator
756 // objects. :(
Chris Lattner5eef6ad2009-08-27 03:51:50 +0000757 //
Chandler Carruthd7a5f2a2012-03-16 06:10:13 +0000758 // Note that it doesn't matter that we are iterating over a non-stable order
Chris Lattner5eef6ad2009-08-27 03:51:50 +0000759 // here to do this, it doesn't matter which order the functions are deleted
760 // in.
Chandler Carruth45ae88f2012-04-01 10:41:24 +0000761 array_pod_sort(FunctionsToRemove.begin(), FunctionsToRemove.end());
Chandler Carruth8562d3a2016-08-03 01:02:31 +0000762 FunctionsToRemove.erase(
763 std::unique(FunctionsToRemove.begin(), FunctionsToRemove.end()),
764 FunctionsToRemove.end());
Yaron Keren62064d62015-06-25 19:28:24 +0000765 for (CallGraphNode *CGN : FunctionsToRemove) {
Easwaran Ramanb1bd3982016-03-08 00:36:35 +0000766 delete CG.removeFunctionFromModule(CGN);
Chris Lattnerbe8bb802004-04-21 20:44:33 +0000767 ++NumDeleted;
Chris Lattnerbe8bb802004-04-21 20:44:33 +0000768 }
Chandler Carruthd7a5f2a2012-03-16 06:10:13 +0000769 return true;
Chris Lattnerc87784f2004-04-20 22:06:53 +0000770}
Chandler Carruth1d963112016-12-20 03:15:32 +0000771
772PreservedAnalyses InlinerPass::run(LazyCallGraph::SCC &InitialC,
773 CGSCCAnalysisManager &AM, LazyCallGraph &CG,
774 CGSCCUpdateResult &UR) {
775 FunctionAnalysisManager &FAM =
776 AM.getResult<FunctionAnalysisManagerCGSCCProxy>(InitialC, CG)
777 .getManager();
778 const ModuleAnalysisManager &MAM =
779 AM.getResult<ModuleAnalysisManagerCGSCCProxy>(InitialC, CG).getManager();
780 bool Changed = false;
781
782 assert(InitialC.size() > 0 && "Cannot handle an empty SCC!");
783 Module &M = *InitialC.begin()->getFunction().getParent();
784 ProfileSummaryInfo *PSI = MAM.getCachedResult<ProfileSummaryAnalysis>(M);
785
786 std::function<AssumptionCache &(Function &)> GetAssumptionCache =
787 [&](Function &F) -> AssumptionCache & {
788 return FAM.getResult<AssumptionAnalysis>(F);
789 };
790
791 // Setup the data structure used to plumb customization into the
792 // `InlineFunction` routine.
793 InlineFunctionInfo IFI(/*cg=*/nullptr);
794
795 auto GetInlineCost = [&](CallSite CS) {
796 Function &Callee = *CS.getCalledFunction();
797 auto &CalleeTTI = FAM.getResult<TargetIRAnalysis>(Callee);
798 return getInlineCost(CS, Params, CalleeTTI, GetAssumptionCache, PSI);
799 };
800
801 // We use a worklist of nodes to process so that we can handle if the SCC
802 // structure changes and some nodes are no longer part of the current SCC. We
803 // also need to use an updatable pointer for the SCC as a consequence.
804 SmallVector<LazyCallGraph::Node *, 16> Nodes;
805 for (auto &N : InitialC)
806 Nodes.push_back(&N);
807 auto *C = &InitialC;
808 auto *RC = &C->getOuterRefSCC();
809
810 // We also use a secondary worklist of call sites within a particular node to
811 // allow quickly continuing to inline through newly inlined call sites where
812 // possible.
813 SmallVector<CallSite, 16> Calls;
814
815 // Track a set vector of inlined callees so that we can augment the caller
816 // with all of their edges in the call graph before pruning out the ones that
817 // got simplified away.
818 SmallSetVector<Function *, 4> InlinedCallees;
819
820 // Track the dead functions to delete once finished with inlining calls. We
821 // defer deleting these to make it easier to handle the call graph updates.
822 SmallVector<Function *, 4> DeadFunctions;
823
824 do {
825 auto &N = *Nodes.pop_back_val();
826 if (CG.lookupSCC(N) != C)
827 continue;
828 Function &F = N.getFunction();
829 if (F.hasFnAttribute(Attribute::OptimizeNone))
830 continue;
831
832 // Get the remarks emission analysis for the caller.
833 auto &ORE = FAM.getResult<OptimizationRemarkEmitterAnalysis>(F);
834
835 // We want to generally process call sites top-down in order for
836 // simplifications stemming from replacing the call with the returned value
837 // after inlining to be visible to subsequent inlining decisions. So we
838 // walk the function backwards and then process the back of the vector.
839 // FIXME: Using reverse is a really bad way to do this. Instead we should
840 // do an actual PO walk of the function body.
841 for (Instruction &I : reverse(instructions(F)))
842 if (auto CS = CallSite(&I))
843 if (Function *Callee = CS.getCalledFunction())
844 if (!Callee->isDeclaration())
845 Calls.push_back(CS);
846
847 bool DidInline = false;
848 while (!Calls.empty()) {
849 CallSite CS = Calls.pop_back_val();
850 Function &Callee = *CS.getCalledFunction();
851
852 // Check whether we want to inline this callsite.
853 if (!shouldInline(CS, GetInlineCost, ORE))
854 continue;
855
856 if (!InlineFunction(CS, IFI))
857 continue;
858 DidInline = true;
859 InlinedCallees.insert(&Callee);
860
861 // Add any new callsites to defined functions to the worklist.
862 for (CallSite &CS : reverse(IFI.InlinedCallSites))
863 if (Function *NewCallee = CS.getCalledFunction())
864 if (!NewCallee->isDeclaration())
865 Calls.push_back(CS);
866
867 // For local functions, check whether this makes the callee trivially
868 // dead. In that case, we can drop the body of the function eagerly
869 // which may reduce the number of callers of other functions to one,
870 // changing inline cost thresholds.
871 if (Callee.hasLocalLinkage()) {
872 // To check this we also need to nuke any dead constant uses (perhaps
873 // made dead by this operation on other functions).
874 Callee.removeDeadConstantUsers();
875 if (Callee.use_empty()) {
876 // Clear the body and queue the function itself for deletion when we
877 // finish inlining and call graph updates.
878 // Note that after this point, it is an error to do anything other
879 // than use the callee's address or delete it.
880 Callee.dropAllReferences();
881 assert(find(DeadFunctions, &Callee) == DeadFunctions.end() &&
882 "Cannot put cause a function to become dead twice!");
883 DeadFunctions.push_back(&Callee);
884 }
885 }
886 }
887
888 if (!DidInline)
889 continue;
890 Changed = true;
891
892 // Add all the inlined callees' edges to the caller. These are by
893 // definition trivial edges as we already had a transitive call edge to the
894 // callee.
895 for (Function *InlinedCallee : InlinedCallees) {
896 LazyCallGraph::Node &CalleeN = *CG.lookup(*InlinedCallee);
897 for (LazyCallGraph::Edge &E : CalleeN)
898 if (E.isCall())
899 RC->insertTrivialCallEdge(N, *E.getNode());
900 else
901 RC->insertTrivialRefEdge(N, *E.getNode());
902 }
903 InlinedCallees.clear();
904
905 // At this point, since we have made changes we have at least removed
906 // a call instruction. However, in the process we do some incremental
907 // simplification of the surrounding code. This simplification can
908 // essentially do all of the same things as a function pass and we can
909 // re-use the exact same logic for updating the call graph to reflect the
910 // change..
911 C = &updateCGAndAnalysisManagerForFunctionPass(CG, *C, N, AM, UR);
912 RC = &C->getOuterRefSCC();
913 } while (!Nodes.empty());
914
915 // Now that we've finished inlining all of the calls across this SCC, delete
916 // all of the trivially dead functions, updating the call graph and the CGSCC
917 // pass manager in the process.
918 //
919 // Note that this walks a pointer set which has non-deterministic order but
920 // that is OK as all we do is delete things and add pointers to unordered
921 // sets.
922 for (Function *DeadF : DeadFunctions) {
923 // Get the necessary information out of the call graph and nuke the
924 // function there.
925 auto &DeadC = *CG.lookupSCC(*CG.lookup(*DeadF));
926 auto &DeadRC = DeadC.getOuterRefSCC();
927 CG.removeDeadFunction(*DeadF);
928
929 // Mark the relevant parts of the call graph as invalid so we don't visit
930 // them.
931 UR.InvalidatedSCCs.insert(&DeadC);
932 UR.InvalidatedRefSCCs.insert(&DeadRC);
933
934 // And delete the actual function from the module.
935 M.getFunctionList().erase(DeadF);
936 }
937 return Changed ? PreservedAnalyses::none() : PreservedAnalyses::all();
938}