LLVM 22.0.0git
Inliner.cpp
Go to the documentation of this file.
1//===- Inliner.cpp - Code common to all inliners --------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file implements the mechanics required to implement inlining without
10// missing any calls and updating the call graph. The decisions of which calls
11// are profitable to inline are implemented elsewhere.
12//
13//===----------------------------------------------------------------------===//
14
17#include "llvm/ADT/STLExtras.h"
18#include "llvm/ADT/ScopeExit.h"
19#include "llvm/ADT/SetVector.h"
22#include "llvm/ADT/Statistic.h"
24#include "llvm/ADT/StringRef.h"
37#include "llvm/IR/Attributes.h"
38#include "llvm/IR/BasicBlock.h"
39#include "llvm/IR/DebugLoc.h"
42#include "llvm/IR/Function.h"
44#include "llvm/IR/Instruction.h"
47#include "llvm/IR/Metadata.h"
48#include "llvm/IR/Module.h"
49#include "llvm/IR/PassManager.h"
50#include "llvm/IR/Value.h"
51#include "llvm/Pass.h"
54#include "llvm/Support/Debug.h"
60#include <algorithm>
61#include <cassert>
62#include <utility>
63
64using namespace llvm;
65
66#define DEBUG_TYPE "inline"
67
68STATISTIC(NumInlined, "Number of functions inlined");
69STATISTIC(NumDeleted, "Number of functions deleted because all callers found");
70
72 "intra-scc-cost-multiplier", cl::init(2), cl::Hidden,
74 "Cost multiplier to multiply onto inlined call sites where the "
75 "new call was previously an intra-SCC call (not relevant when the "
76 "original call was already intra-SCC). This can accumulate over "
77 "multiple inlinings (e.g. if a call site already had a cost "
78 "multiplier and one of its inlined calls was also subject to "
79 "this, the inlined call would have the original multiplier "
80 "multiplied by intra-scc-cost-multiplier). This is to prevent tons of "
81 "inlining through a child SCC which can cause terrible compile times"));
82
83/// A flag for test, so we can print the content of the advisor when running it
84/// as part of the default (e.g. -O3) pipeline.
85static cl::opt<bool> KeepAdvisorForPrinting("keep-inline-advisor-for-printing",
86 cl::init(false), cl::Hidden);
87
88/// Allows printing the contents of the advisor after each SCC inliner pass.
89static cl::opt<bool>
90 EnablePostSCCAdvisorPrinting("enable-scc-inline-advisor-printing",
91 cl::init(false), cl::Hidden);
92
93
95 "cgscc-inline-replay", cl::init(""), cl::value_desc("filename"),
97 "Optimization remarks file containing inline remarks to be replayed "
98 "by cgscc inlining."),
100
102 "cgscc-inline-replay-scope",
103 cl::init(ReplayInlinerSettings::Scope::Function),
104 cl::values(clEnumValN(ReplayInlinerSettings::Scope::Function, "Function",
105 "Replay on functions that have remarks associated "
106 "with them (default)"),
107 clEnumValN(ReplayInlinerSettings::Scope::Module, "Module",
108 "Replay on the entire module")),
109 cl::desc("Whether inline replay should be applied to the entire "
110 "Module or just the Functions (default) that are present as "
111 "callers in remarks during cgscc inlining."),
112 cl::Hidden);
113
115 "cgscc-inline-replay-fallback",
116 cl::init(ReplayInlinerSettings::Fallback::Original),
119 ReplayInlinerSettings::Fallback::Original, "Original",
120 "All decisions not in replay send to original advisor (default)"),
121 clEnumValN(ReplayInlinerSettings::Fallback::AlwaysInline,
122 "AlwaysInline", "All decisions not in replay are inlined"),
123 clEnumValN(ReplayInlinerSettings::Fallback::NeverInline, "NeverInline",
124 "All decisions not in replay are not inlined")),
125 cl::desc(
126 "How cgscc inline replay treats sites that don't come from the replay. "
127 "Original: defers to original advisor, AlwaysInline: inline all sites "
128 "not in replay, NeverInline: inline no sites not in replay"),
129 cl::Hidden);
130
132 "cgscc-inline-replay-format",
133 cl::init(CallSiteFormat::Format::LineColumnDiscriminator),
135 clEnumValN(CallSiteFormat::Format::Line, "Line", "<Line Number>"),
136 clEnumValN(CallSiteFormat::Format::LineColumn, "LineColumn",
137 "<Line Number>:<Column Number>"),
138 clEnumValN(CallSiteFormat::Format::LineDiscriminator,
139 "LineDiscriminator", "<Line Number>.<Discriminator>"),
140 clEnumValN(CallSiteFormat::Format::LineColumnDiscriminator,
141 "LineColumnDiscriminator",
142 "<Line Number>:<Column Number>.<Discriminator> (default)")),
143 cl::desc("How cgscc inline replay file is formatted"), cl::Hidden);
144
145/// Return true if the specified inline history ID
146/// indicates an inline history that includes the specified function.
148 Function *F, int InlineHistoryID,
149 const SmallVectorImpl<std::pair<Function *, int>> &InlineHistory) {
150 while (InlineHistoryID != -1) {
151 assert(unsigned(InlineHistoryID) < InlineHistory.size() &&
152 "Invalid inline history ID");
153 if (InlineHistory[InlineHistoryID].first == F)
154 return true;
155 InlineHistoryID = InlineHistory[InlineHistoryID].second;
156 }
157 return false;
158}
159
161InlinerPass::getAdvisor(const ModuleAnalysisManagerCGSCCProxy::Result &MAM,
163 if (OwnedAdvisor)
164 return *OwnedAdvisor;
165
167 if (!IAA) {
168 // It should still be possible to run the inliner as a stand-alone SCC pass,
169 // for test scenarios. In that case, we default to the
170 // DefaultInlineAdvisor, which doesn't need to keep state between SCC pass
171 // runs. It also uses just the default InlineParams.
172 // In this case, we need to use the provided FAM, which is valid for the
173 // duration of the inliner pass, and thus the lifetime of the owned advisor.
174 // The one we would get from the MAM can be invalidated as a result of the
175 // inliner's activity.
176 OwnedAdvisor = std::make_unique<DefaultInlineAdvisor>(
177 M, FAM, getInlineParams(),
179
180 if (!CGSCCInlineReplayFile.empty())
181 OwnedAdvisor = getReplayInlineAdvisor(
182 M, FAM, M.getContext(), std::move(OwnedAdvisor),
183 ReplayInlinerSettings{CGSCCInlineReplayFile,
184 CGSCCInlineReplayScope,
185 CGSCCInlineReplayFallback,
186 {CGSCCInlineReplayFormat}},
187 /*EmitRemarks=*/true,
189
190 return *OwnedAdvisor;
191 }
192 assert(IAA->getAdvisor() &&
193 "Expected a present InlineAdvisorAnalysis also have an "
194 "InlineAdvisor initialized");
195 return *IAA->getAdvisor();
196}
197
199 F.dropAllReferences();
201 BB.eraseFromParent();
202 BasicBlock *BB = BasicBlock::Create(F.getContext(), "", &F);
203 new UnreachableInst(F.getContext(), BB);
204}
205
208 CGSCCUpdateResult &UR) {
209 const auto &MAMProxy =
211 bool Changed = false;
212
213 assert(InitialC.size() > 0 && "Cannot handle an empty SCC!");
214 Module &M = *InitialC.begin()->getFunction().getParent();
215 ProfileSummaryInfo *PSI = MAMProxy.getCachedResult<ProfileSummaryAnalysis>(M);
216
219 .getManager();
220
221 InlineAdvisor &Advisor = getAdvisor(MAMProxy, FAM, M);
222 Advisor.onPassEntry(&InitialC);
223
224 // We use a single common worklist for calls across the entire SCC. We
225 // process these in-order and append new calls introduced during inlining to
226 // the end. The PriorityInlineOrder is optional here, in which the smaller
227 // callee would have a higher priority to inline.
228 //
229 // Note that this particular order of processing is actually critical to
230 // avoid very bad behaviors. Consider *highly connected* call graphs where
231 // each function contains a small amount of code and a couple of calls to
232 // other functions. Because the LLVM inliner is fundamentally a bottom-up
233 // inliner, it can handle gracefully the fact that these all appear to be
234 // reasonable inlining candidates as it will flatten things until they become
235 // too big to inline, and then move on and flatten another batch.
236 //
237 // However, when processing call edges *within* an SCC we cannot rely on this
238 // bottom-up behavior. As a consequence, with heavily connected *SCCs* of
239 // functions we can end up incrementally inlining N calls into each of
240 // N functions because each incremental inlining decision looks good and we
241 // don't have a topological ordering to prevent explosions.
242 //
243 // To compensate for this, we don't process transitive edges made immediate
244 // by inlining until we've done one pass of inlining across the entire SCC.
245 // Large, highly connected SCCs still lead to some amount of code bloat in
246 // this model, but it is uniformly spread across all the functions in the SCC
247 // and eventually they all become too large to inline, rather than
248 // incrementally maknig a single function grow in a super linear fashion.
250
251 // Populate the initial list of calls in this SCC.
252 for (auto &N : InitialC) {
253 auto &ORE =
255 // We want to generally process call sites top-down in order for
256 // simplifications stemming from replacing the call with the returned value
257 // after inlining to be visible to subsequent inlining decisions.
258 // FIXME: Using instructions sequence is a really bad way to do this.
259 // Instead we should do an actual RPO walk of the function body.
260 for (Instruction &I : instructions(N.getFunction()))
261 if (auto *CB = dyn_cast<CallBase>(&I))
262 if (Function *Callee = CB->getCalledFunction()) {
263 if (!Callee->isDeclaration())
264 Calls.push_back({CB, -1});
265 else if (!isa<IntrinsicInst>(I)) {
266 using namespace ore;
267 setInlineRemark(*CB, "unavailable definition");
268 ORE.emit([&]() {
269 return OptimizationRemarkMissed(DEBUG_TYPE, "NoDefinition", &I)
270 << NV("Callee", Callee) << " will not be inlined into "
271 << NV("Caller", CB->getCaller())
272 << " because its definition is unavailable"
273 << setIsVerbose();
274 });
275 }
276 }
277 }
278
279 // Capture updatable variable for the current SCC.
280 auto *C = &InitialC;
281
282 auto AdvisorOnExit = make_scope_exit([&] { Advisor.onPassExit(C); });
283
284 if (Calls.empty())
285 return PreservedAnalyses::all();
286
287 // When inlining a callee produces new call sites, we want to keep track of
288 // the fact that they were inlined from the callee. This allows us to avoid
289 // infinite inlining in some obscure cases. To represent this, we use an
290 // index into the InlineHistory vector.
292
293 // Track a set vector of inlined callees so that we can augment the caller
294 // with all of their edges in the call graph before pruning out the ones that
295 // got simplified away.
296 SmallSetVector<Function *, 4> InlinedCallees;
297
298 // Track the dead functions to delete once finished with inlining calls. We
299 // defer deleting these to make it easier to handle the call graph updates.
300 SmallVector<Function *, 4> DeadFunctions;
301
302 // Track potentially dead non-local functions with comdats to see if they can
303 // be deleted as a batch after inlining.
304 SmallVector<Function *, 4> DeadFunctionsInComdats;
305
306 // Loop forward over all of the calls. Note that we cannot cache the size as
307 // inlining can introduce new calls that need to be processed.
308 for (int I = 0; I < (int)Calls.size(); ++I) {
309 // We expect the calls to typically be batched with sequences of calls that
310 // have the same caller, so we first set up some shared infrastructure for
311 // this caller. We also do any pruning we can at this layer on the caller
312 // alone.
313 Function &F = *Calls[I].first->getCaller();
314 LazyCallGraph::Node &N = *CG.lookup(F);
315 if (CG.lookupSCC(N) != C)
316 continue;
317
318 LLVM_DEBUG(dbgs() << "Inlining calls in: " << F.getName() << "\n"
319 << " Function size: " << F.getInstructionCount()
320 << "\n");
321
322 auto GetAssumptionCache = [&](Function &F) -> AssumptionCache & {
324 };
325
326 // Now process as many calls as we have within this caller in the sequence.
327 // We bail out as soon as the caller has to change so we can update the
328 // call graph and prepare the context of that new caller.
329 bool DidInline = false;
330 for (; I < (int)Calls.size() && Calls[I].first->getCaller() == &F; ++I) {
331 auto &P = Calls[I];
332 CallBase *CB = P.first;
333 const int InlineHistoryID = P.second;
335
336 if (InlineHistoryID != -1 &&
337 inlineHistoryIncludes(&Callee, InlineHistoryID, InlineHistory)) {
338 LLVM_DEBUG(dbgs() << "Skipping inlining due to history: " << F.getName()
339 << " -> " << Callee.getName() << "\n");
340 setInlineRemark(*CB, "recursive");
341 // Set noinline so that we don't forget this decision across CGSCC
342 // iterations.
343 CB->setIsNoInline();
344 continue;
345 }
346
347 // Check if this inlining may repeat breaking an SCC apart that has
348 // already been split once before. In that case, inlining here may
349 // trigger infinite inlining, much like is prevented within the inliner
350 // itself by the InlineHistory above, but spread across CGSCC iterations
351 // and thus hidden from the full inline history.
352 LazyCallGraph::SCC *CalleeSCC = CG.lookupSCC(*CG.lookup(Callee));
353 if (CalleeSCC == C && UR.InlinedInternalEdges.count({&N, C})) {
354 LLVM_DEBUG(dbgs() << "Skipping inlining internal SCC edge from a node "
355 "previously split out of this SCC by inlining: "
356 << F.getName() << " -> " << Callee.getName() << "\n");
357 setInlineRemark(*CB, "recursive SCC split");
358 continue;
359 }
360
361 std::unique_ptr<InlineAdvice> Advice =
362 Advisor.getAdvice(*CB, OnlyMandatory);
363
364 // Check whether we want to inline this callsite.
365 if (!Advice)
366 continue;
367
368 if (!Advice->isInliningRecommended()) {
369 Advice->recordUnattemptedInlining();
370 continue;
371 }
372
373 int CBCostMult =
376 .value_or(1);
377
378 // Setup the data structure used to plumb customization into the
379 // `InlineFunction` routine.
381 GetAssumptionCache, PSI,
384
386 *CB, IFI, /*MergeAttributes=*/true,
387 &FAM.getResult<AAManager>(*CB->getCaller()), true, nullptr,
389 if (!IR.isSuccess()) {
390 Advice->recordUnsuccessfulInlining(IR);
391 continue;
392 }
393 // TODO: Shouldn't we be invalidating all analyses on F here?
394 // The caller was modified, so invalidate Ephemeral Values.
396
397 DidInline = true;
398 InlinedCallees.insert(&Callee);
399 ++NumInlined;
400
401 LLVM_DEBUG(dbgs() << " Size after inlining: "
402 << F.getInstructionCount() << "\n");
403
404 // Add any new callsites to defined functions to the worklist.
405 if (!IFI.InlinedCallSites.empty()) {
406 int NewHistoryID = InlineHistory.size();
407 InlineHistory.push_back({&Callee, InlineHistoryID});
408
409 for (CallBase *ICB : reverse(IFI.InlinedCallSites)) {
410 Function *NewCallee = ICB->getCalledFunction();
411 assert(!(NewCallee && NewCallee->isIntrinsic()) &&
412 "Intrinsic calls should not be tracked.");
413 if (!NewCallee) {
414 // Try to promote an indirect (virtual) call without waiting for
415 // the post-inline cleanup and the next DevirtSCCRepeatedPass
416 // iteration because the next iteration may not happen and we may
417 // miss inlining it.
418 if (tryPromoteCall(*ICB))
419 NewCallee = ICB->getCalledFunction();
420 }
421 if (NewCallee) {
422 if (!NewCallee->isDeclaration()) {
423 Calls.push_back({ICB, NewHistoryID});
424 // Continually inlining through an SCC can result in huge compile
425 // times and bloated code since we arbitrarily stop at some point
426 // when the inliner decides it's not profitable to inline anymore.
427 // We attempt to mitigate this by making these calls exponentially
428 // more expensive.
429 // This doesn't apply to calls in the same SCC since if we do
430 // inline through the SCC the function will end up being
431 // self-recursive which the inliner bails out on, and inlining
432 // within an SCC is necessary for performance.
433 if (CalleeSCC != C &&
434 CalleeSCC == CG.lookupSCC(CG.get(*NewCallee))) {
435 Attribute NewCBCostMult = Attribute::get(
436 M.getContext(),
438 itostr(CBCostMult * IntraSCCCostMultiplier));
439 ICB->addFnAttr(NewCBCostMult);
440 }
441 }
442 }
443 }
444 }
445
446 // For local functions or discardable functions without comdats, check
447 // whether this makes the callee trivially dead. In that case, we can drop
448 // the body of the function eagerly which may reduce the number of callers
449 // of other functions to one, changing inline cost thresholds. Non-local
450 // discardable functions with comdats are checked later on.
451 bool CalleeWasDeleted = false;
452 if (Callee.isDiscardableIfUnused() && Callee.hasZeroLiveUses() &&
453 !CG.isLibFunction(Callee)) {
454 if (Callee.hasLocalLinkage() || !Callee.hasComdat()) {
455 Calls.erase(
456 std::remove_if(Calls.begin() + I + 1, Calls.end(),
457 [&](const std::pair<CallBase *, int> &Call) {
458 return Call.first->getCaller() == &Callee;
459 }),
460 Calls.end());
461
462 // Report inlining decision BEFORE deleting function contents, so we
463 // can still access e.g. the DebugLoc
464 Advice->recordInliningWithCalleeDeleted();
465 // Clear the body and queue the function itself for call graph
466 // updating when we finish inlining.
468 assert(!is_contained(DeadFunctions, &Callee) &&
469 "Cannot put cause a function to become dead twice!");
470 DeadFunctions.push_back(&Callee);
471 CalleeWasDeleted = true;
472 } else {
473 DeadFunctionsInComdats.push_back(&Callee);
474 }
475 }
476 if (!CalleeWasDeleted)
477 Advice->recordInlining();
478 }
479
480 // Back the call index up by one to put us in a good position to go around
481 // the outer loop.
482 --I;
483
484 if (!DidInline)
485 continue;
486 Changed = true;
487
488 // At this point, since we have made changes we have at least removed
489 // a call instruction. However, in the process we do some incremental
490 // simplification of the surrounding code. This simplification can
491 // essentially do all of the same things as a function pass and we can
492 // re-use the exact same logic for updating the call graph to reflect the
493 // change.
494
495 // Inside the update, we also update the FunctionAnalysisManager in the
496 // proxy for this particular SCC. We do this as the SCC may have changed and
497 // as we're going to mutate this particular function we want to make sure
498 // the proxy is in place to forward any invalidation events.
499 LazyCallGraph::SCC *OldC = C;
501 LLVM_DEBUG(dbgs() << "Updated inlining SCC: " << *C << "\n");
502
503 // If this causes an SCC to split apart into multiple smaller SCCs, there
504 // is a subtle risk we need to prepare for. Other transformations may
505 // expose an "infinite inlining" opportunity later, and because of the SCC
506 // mutation, we will revisit this function and potentially re-inline. If we
507 // do, and that re-inlining also has the potentially to mutate the SCC
508 // structure, the infinite inlining problem can manifest through infinite
509 // SCC splits and merges. To avoid this, we capture the originating caller
510 // node and the SCC containing the call edge. This is a slight over
511 // approximation of the possible inlining decisions that must be avoided,
512 // but is relatively efficient to store. We use C != OldC to know when
513 // a new SCC is generated and the original SCC may be generated via merge
514 // in later iterations.
515 //
516 // It is also possible that even if no new SCC is generated
517 // (i.e., C == OldC), the original SCC could be split and then merged
518 // into the same one as itself. and the original SCC will be added into
519 // UR.CWorklist again, we want to catch such cases too.
520 //
521 // FIXME: This seems like a very heavyweight way of retaining the inline
522 // history, we should look for a more efficient way of tracking it.
523 if ((C != OldC || UR.CWorklist.count(OldC)) &&
524 llvm::any_of(InlinedCallees, [&](Function *Callee) {
525 return CG.lookupSCC(*CG.lookup(*Callee)) == OldC;
526 })) {
527 LLVM_DEBUG(dbgs() << "Inlined an internal call edge and split an SCC, "
528 "retaining this to avoid infinite inlining.\n");
529 UR.InlinedInternalEdges.insert({&N, OldC});
530 }
531 InlinedCallees.clear();
532
533 // Invalidate analyses for this function now so that we don't have to
534 // invalidate analyses for all functions in this SCC later.
536 }
537
538 // We must ensure that we only delete functions with comdats if every function
539 // in the comdat is going to be deleted.
540 if (!DeadFunctionsInComdats.empty()) {
541 filterDeadComdatFunctions(DeadFunctionsInComdats);
542 for (auto *Callee : DeadFunctionsInComdats)
544 DeadFunctions.append(DeadFunctionsInComdats);
545 }
546
547 // Now that we've finished inlining all of the calls across this SCC, delete
548 // all of the trivially dead functions, updating the call graph and the CGSCC
549 // pass manager in the process.
550 //
551 // Note that this walks a pointer set which has non-deterministic order but
552 // that is OK as all we do is delete things and add pointers to unordered
553 // sets.
554 for (Function *DeadF : DeadFunctions) {
555 CG.markDeadFunction(*DeadF);
556 // Get the necessary information out of the call graph and nuke the
557 // function there. Also, clear out any cached analyses.
558 auto &DeadC = *CG.lookupSCC(*CG.lookup(*DeadF));
559 FAM.clear(*DeadF, DeadF->getName());
560 AM.clear(DeadC, DeadC.getName());
561
562 // Mark the relevant parts of the call graph as invalid so we don't visit
563 // them.
564 UR.InvalidatedSCCs.insert(&DeadC);
565
566 UR.DeadFunctions.push_back(DeadF);
567
568 ++NumDeleted;
569 }
570
571 if (!Changed)
572 return PreservedAnalyses::all();
573
575 // Even if we change the IR, we update the core CGSCC data structures and so
576 // can preserve the proxy to the function analysis manager.
578 // We have already invalidated all analyses on modified functions.
580 return PA;
581}
582
584 bool MandatoryFirst,
585 InlineContext IC,
587 unsigned MaxDevirtIterations)
588 : Params(Params), IC(IC), Mode(Mode),
590 // Run the inliner first. The theory is that we are walking bottom-up and so
591 // the callees have already been fully optimized, and we want to inline them
592 // into the callers so that our optimizations can reflect that.
593 // For PreLinkThinLTO pass, we disable hot-caller heuristic for sample PGO
594 // because it makes profile annotation in the backend inaccurate.
595 if (MandatoryFirst) {
596 PM.addPass(InlinerPass(/*OnlyMandatory*/ true));
599 }
600 PM.addPass(InlinerPass());
603}
604
607 auto &IAA = MAM.getResult<InlineAdvisorAnalysis>(M);
608 if (!IAA.tryCreate(Params, Mode,
609 {CGSCCInlineReplayFile,
610 CGSCCInlineReplayScope,
611 CGSCCInlineReplayFallback,
612 {CGSCCInlineReplayFormat}},
613 IC)) {
614 M.getContext().emitError(
615 "Could not setup Inlining Advisor for the requested "
616 "mode and/or options");
617 return PreservedAnalyses::all();
618 }
619
620 // We wrap the CGSCC pipeline in a devirtualization repeater. This will try
621 // to detect when we devirtualize indirect calls and iterate the SCC passes
622 // in that case to try and catch knock-on inlining or function attrs
623 // opportunities. Then we add it to the module pipeline by walking the SCCs
624 // in postorder (or bottom-up).
625 // If MaxDevirtIterations is 0, we just don't use the devirtualization
626 // wrapper.
627 if (MaxDevirtIterations == 0)
628 MPM.addPass(createModuleToPostOrderCGSCCPassAdaptor(std::move(PM)));
629 else
632
633 MPM.addPass(std::move(AfterCGMPM));
634 MPM.run(M, MAM);
635
636 // Discard the InlineAdvisor, a subsequent inlining session should construct
637 // its own.
638 auto PA = PreservedAnalyses::all();
640 PA.abandon<InlineAdvisorAnalysis>();
641 return PA;
642}
643
645 raw_ostream &OS, function_ref<StringRef(StringRef)> MapClassName2PassName) {
646 static_cast<PassInfoMixin<InlinerPass> *>(this)->printPipeline(
647 OS, MapClassName2PassName);
648 if (OnlyMandatory)
649 OS << "<only-mandatory>";
650}
651
653 raw_ostream &OS, function_ref<StringRef(StringRef)> MapClassName2PassName) {
654 // Print some info about passes added to the wrapper. This is however
655 // incomplete as InlineAdvisorAnalysis part isn't included (which also depends
656 // on Params and Mode).
657 if (!MPM.isEmpty()) {
658 MPM.printPipeline(OS, MapClassName2PassName);
659 OS << ',';
660 }
661 OS << "cgscc(";
662 if (MaxDevirtIterations != 0)
663 OS << "devirt<" << MaxDevirtIterations << ">(";
664 PM.printPipeline(OS, MapClassName2PassName);
665 if (MaxDevirtIterations != 0)
666 OS << ')';
667 OS << ')';
668}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
Expand Atomic instructions
This file contains the simple types necessary to represent the attributes associated with functions a...
This is the interface for LLVM's primary stateless and local alias analysis.
This header provides classes for managing passes over SCCs of the call graph.
#define clEnumValN(ENUMVAL, FLAGNAME, DESC)
Definition: CommandLine.h:687
#define DEBUG_TYPE
Module.h This file contains the declarations for the Module class.
This header defines various interfaces for pass management in LLVM.
static bool inlineHistoryIncludes(Function *F, int InlineHistoryID, const SmallVectorImpl< std::pair< Function *, int > > &InlineHistory)
Return true if the specified inline history ID indicates an inline history that includes the specifie...
Definition: Inliner.cpp:147
static cl::opt< ReplayInlinerSettings::Scope > CGSCCInlineReplayScope("cgscc-inline-replay-scope", cl::init(ReplayInlinerSettings::Scope::Function), cl::values(clEnumValN(ReplayInlinerSettings::Scope::Function, "Function", "Replay on functions that have remarks associated " "with them (default)"), clEnumValN(ReplayInlinerSettings::Scope::Module, "Module", "Replay on the entire module")), cl::desc("Whether inline replay should be applied to the entire " "Module or just the Functions (default) that are present as " "callers in remarks during cgscc inlining."), cl::Hidden)
static cl::opt< bool > KeepAdvisorForPrinting("keep-inline-advisor-for-printing", cl::init(false), cl::Hidden)
A flag for test, so we can print the content of the advisor when running it as part of the default (e...
static cl::opt< std::string > CGSCCInlineReplayFile("cgscc-inline-replay", cl::init(""), cl::value_desc("filename"), cl::desc("Optimization remarks file containing inline remarks to be replayed " "by cgscc inlining."), cl::Hidden)
static cl::opt< bool > EnablePostSCCAdvisorPrinting("enable-scc-inline-advisor-printing", cl::init(false), cl::Hidden)
Allows printing the contents of the advisor after each SCC inliner pass.
static cl::opt< int > IntraSCCCostMultiplier("intra-scc-cost-multiplier", cl::init(2), cl::Hidden, cl::desc("Cost multiplier to multiply onto inlined call sites where the " "new call was previously an intra-SCC call (not relevant when the " "original call was already intra-SCC). This can accumulate over " "multiple inlinings (e.g. if a call site already had a cost " "multiplier and one of its inlined calls was also subject to " "this, the inlined call would have the original multiplier " "multiplied by intra-scc-cost-multiplier). This is to prevent tons of " "inlining through a child SCC which can cause terrible compile times"))
static cl::opt< CallSiteFormat::Format > CGSCCInlineReplayFormat("cgscc-inline-replay-format", cl::init(CallSiteFormat::Format::LineColumnDiscriminator), cl::values(clEnumValN(CallSiteFormat::Format::Line, "Line", "<Line Number>"), clEnumValN(CallSiteFormat::Format::LineColumn, "LineColumn", "<Line Number>:<Column Number>"), clEnumValN(CallSiteFormat::Format::LineDiscriminator, "LineDiscriminator", "<Line Number>.<Discriminator>"), clEnumValN(CallSiteFormat::Format::LineColumnDiscriminator, "LineColumnDiscriminator", "<Line Number>:<Column Number>.<Discriminator> (default)")), cl::desc("How cgscc inline replay file is formatted"), cl::Hidden)
void makeFunctionBodyUnreachable(Function &F)
Definition: Inliner.cpp:198
static cl::opt< ReplayInlinerSettings::Fallback > CGSCCInlineReplayFallback("cgscc-inline-replay-fallback", cl::init(ReplayInlinerSettings::Fallback::Original), cl::values(clEnumValN(ReplayInlinerSettings::Fallback::Original, "Original", "All decisions not in replay send to original advisor (default)"), clEnumValN(ReplayInlinerSettings::Fallback::AlwaysInline, "AlwaysInline", "All decisions not in replay are inlined"), clEnumValN(ReplayInlinerSettings::Fallback::NeverInline, "NeverInline", "All decisions not in replay are not inlined")), cl::desc("How cgscc inline replay treats sites that don't come from the replay. " "Original: defers to original advisor, AlwaysInline: inline all sites " "not in replay, NeverInline: inline no sites not in replay"), cl::Hidden)
Implements a lazy call graph analysis and related passes for the new pass manager.
Legalize the Machine IR a function s Machine IR
Definition: Legalizer.cpp:80
#define F(x, y, z)
Definition: MD5.cpp:55
#define I(x, y, z)
Definition: MD5.cpp:58
This file contains the declarations for metadata subclasses.
#define P(N)
FunctionAnalysisManager FAM
ModuleAnalysisManager MAM
This file provides a priority worklist.
This file contains some templates that are useful if you are working with the STL at all.
raw_pwrite_stream & OS
This file defines the make_scope_exit function, which executes user-defined cleanup logic at scope ex...
This file implements a set that has insertion order iteration characteristics.
This file defines the SmallPtrSet class.
This file defines the SmallVector class.
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
Definition: Statistic.h:167
This file contains some functions that are useful when dealing with strings.
#define LLVM_DEBUG(...)
Definition: Debug.h:119
A manager for alias analyses.
This templated class represents "all analyses that operate over <a particular IR unit>" (e....
Definition: Analysis.h:50
A container for analyses that lazily runs them and caches their results.
Definition: PassManager.h:255
void clear(IRUnitT &IR, llvm::StringRef Name)
Clear any cached analysis results for a single unit of IR.
void invalidate(IRUnitT &IR, const PreservedAnalyses &PA)
Invalidate cached analyses for an IR unit.
PassT::Result * getCachedResult(IRUnitT &IR) const
Get the cached result of an analysis pass for a given IR unit.
Definition: PassManager.h:431
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
Definition: PassManager.h:412
A function analysis which provides an AssumptionCache.
A cache of @llvm.assume calls within a function.
static LLVM_ABI Attribute get(LLVMContext &Context, AttrKind Kind, uint64_t Val=0)
Return a uniquified Attribute object.
Definition: Attributes.cpp:95
LLVM Basic Block Representation.
Definition: BasicBlock.h:62
static BasicBlock * Create(LLVMContext &Context, const Twine &Name="", Function *Parent=nullptr, BasicBlock *InsertBefore=nullptr)
Creates a new BasicBlock.
Definition: BasicBlock.h:206
Analysis pass which computes BlockFrequencyInfo.
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
Definition: InstrTypes.h:1116
Function * getCalledFunction() const
Returns the function called, or null if this is an indirect function invocation or the function signa...
Definition: InstrTypes.h:1348
void setIsNoInline()
Definition: InstrTypes.h:1915
LLVM_ABI Function * getCaller()
Helper to get the caller (the parent function).
A proxy from a FunctionAnalysisManager to an SCC.
bool isIntrinsic() const
isIntrinsic - Returns true if the function's name starts with "llvm.".
Definition: Function.h:249
LLVM_ABI bool isDeclaration() const
Return true if the primary definition of this global value is outside of the current translation unit...
Definition: Globals.cpp:316
Printer pass for the InlineAdvisorAnalysis results.
The InlineAdvisorAnalysis is a module pass because the InlineAdvisor needs to capture state right bef...
Interface for deciding whether to inline a call site or not.
virtual void onPassEntry(LazyCallGraph::SCC *SCC=nullptr)
This must be called when the Inliner pass is entered, to allow the InlineAdvisor update internal stat...
This class captures the data input to the InlineFunction call, and records the auxiliary results prod...
Definition: Cloning.h:251
InlineResult is basically true or false.
Definition: InlineCost.h:181
The inliner pass for the new pass manager.
Definition: Inliner.h:36
LLVM_ABI void printPipeline(raw_ostream &OS, function_ref< StringRef(StringRef)> MapClassName2PassName)
Definition: Inliner.cpp:644
LLVM_ABI PreservedAnalyses run(LazyCallGraph::SCC &C, CGSCCAnalysisManager &AM, LazyCallGraph &CG, CGSCCUpdateResult &UR)
Definition: Inliner.cpp:206
A node in the call graph.
An SCC of the call graph.
iterator begin() const
A lazily constructed view of the call graph of a module.
LLVM_ABI PreservedAnalyses run(Module &, ModuleAnalysisManager &)
Definition: Inliner.cpp:605
LLVM_ABI void printPipeline(raw_ostream &OS, function_ref< StringRef(StringRef)> MapClassName2PassName)
Definition: Inliner.cpp:652
LLVM_ABI ModuleInlinerWrapperPass(InlineParams Params=getInlineParams(), bool MandatoryFirst=true, InlineContext IC={}, InliningAdvisorMode Mode=InliningAdvisorMode::Default, unsigned MaxDevirtIterations=0)
Definition: Inliner.cpp:583
A Module instance is used to store all the information related to an LLVM module.
Definition: Module.h:67
Diagnostic information for missed-optimization remarks.
Result proxy object for OuterAnalysisManagerProxy.
Definition: PassManager.h:719
An analysis over an "inner" IR unit that provides access to an analysis manager over a "outer" IR uni...
Definition: PassManager.h:716
void printPipeline(raw_ostream &OS, function_ref< StringRef(StringRef)> MapClassName2PassName)
Definition: PassManager.h:179
LLVM_ATTRIBUTE_MINSIZE std::enable_if_t<!std::is_same_v< PassT, PassManager > > addPass(PassT &&Pass)
Definition: PassManager.h:196
bool isEmpty() const
Returns if the pass manager contains any passes.
Definition: PassManager.h:218
A set of analyses that are preserved following a run of a transformation pass.
Definition: Analysis.h:112
static PreservedAnalyses none()
Convenience factory function for the empty preserved set.
Definition: Analysis.h:115
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
Definition: Analysis.h:118
PreservedAnalyses & preserveSet()
Mark an analysis set as preserved.
Definition: Analysis.h:151
PreservedAnalyses & preserve()
Mark an analysis as preserved.
Definition: Analysis.h:132
An analysis pass based on the new PM to deliver ProfileSummaryInfo.
Analysis providing profile information.
void clear()
Completely clear the SetVector.
Definition: SetVector.h:284
bool insert(const value_type &X)
Insert a new element into the SetVector.
Definition: SetVector.h:168
A SetVector that performs no allocations if smaller than a certain size.
Definition: SetVector.h:356
bool empty() const
Definition: SmallVector.h:82
size_t size() const
Definition: SmallVector.h:79
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
Definition: SmallVector.h:574
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
Definition: SmallVector.h:684
void push_back(const T &Elt)
Definition: SmallVector.h:414
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition: SmallVector.h:1197
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:55
This function has undefined behavior.
An efficient, type-erasing, non-owning reference to a callable.
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition: raw_ostream.h:53
@ C
The default llvm calling convention, compatible with C.
Definition: CallingConv.h:34
const char FunctionInlineCostMultiplierAttributeName[]
Definition: InlineCost.h:60
ValuesClass values(OptsTy... Options)
Helper to build a ValuesClass by forwarding a variable number of arguments as an initializer list to ...
Definition: CommandLine.h:712
initializer< Ty > init(const Ty &Val)
Definition: CommandLine.h:444
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
LLVM_ABI InlineResult InlineFunction(CallBase &CB, InlineFunctionInfo &IFI, bool MergeAttributes=false, AAResults *CalleeAAR=nullptr, bool InsertLifetime=true, Function *ForwardVarArgsTo=nullptr, OptimizationRemarkEmitter *ORE=nullptr)
This function inlines the called function into the basic block of the caller.
detail::scope_exit< std::decay_t< Callable > > make_scope_exit(Callable &&F)
Definition: ScopeExit.h:59
InliningAdvisorMode
There are 4 scenarios we can use the InlineAdvisor:
Definition: InlineAdvisor.h:43
LLVM_ABI std::optional< int > getStringFnAttrAsInt(CallBase &CB, StringRef AttrKind)
Definition: InlineCost.cpp:197
DevirtSCCRepeatedPass createDevirtSCCRepeatedPass(CGSCCPassT &&Pass, int MaxIterations)
A function to deduce a function pass type and wrap it in the templated adaptor.
LLVM_ABI LazyCallGraph::SCC & updateCGAndAnalysisManagerForCGSCCPass(LazyCallGraph &G, LazyCallGraph::SCC &C, LazyCallGraph::Node &N, CGSCCAnalysisManager &AM, CGSCCUpdateResult &UR, FunctionAnalysisManager &FAM)
Helper to update the call graph after running a CGSCC pass.
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
Definition: STLExtras.h:663
LLVM_ABI void setInlineRemark(CallBase &CB, StringRef Message)
Set the inline-remark attribute.
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
Definition: STLExtras.h:1751
ModuleToPostOrderCGSCCPassAdaptor createModuleToPostOrderCGSCCPassAdaptor(CGSCCPassT &&Pass)
A function to deduce a function pass type and wrap it in the templated adaptor.
auto reverse(ContainerTy &&C)
Definition: STLExtras.h:428
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition: Debug.cpp:207
std::unique_ptr< InlineAdvisor > getReplayInlineAdvisor(Module &M, FunctionAnalysisManager &FAM, LLVMContext &Context, std::unique_ptr< InlineAdvisor > OriginalAdvisor, const ReplayInlinerSettings &ReplaySettings, bool EmitRemarks, InlineContext IC)
LLVM_ABI InlineParams getInlineParams()
Generate the parameters to tune the inline cost analysis based only on the commandline options.
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Definition: STLExtras.h:1916
LLVM_ABI void filterDeadComdatFunctions(SmallVectorImpl< Function * > &DeadComdatFunctions)
Filter out potentially dead comdat functions where other entries keep the entire comdat group alive.
LLVM_ABI bool tryPromoteCall(CallBase &CB)
Try to promote (devirtualize) a virtual call on an Alloca.
cl::opt< unsigned > MaxDevirtIterations("max-devirt-iterations", cl::ReallyHidden, cl::init(4))
#define N
Support structure for SCC passes to communicate updates the call graph back to the CGSCC pass manager...
Provides context on when an inline advisor is constructed in the pipeline (e.g., link phase,...
Definition: InlineAdvisor.h:59
Thresholds to tune inline cost analysis.
Definition: InlineCost.h:207
A CRTP mix-in to automatically provide informational APIs needed for passes.
Definition: PassManager.h:70