LLVM 24.0.0git
TailRecursionElimination.cpp
Go to the documentation of this file.
1//===- TailRecursionElimination.cpp - Eliminate Tail Calls ----------------===//
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 transforms calls of the current function (self recursion) followed
10// by a return instruction with a branch to the entry of the function, creating
11// a loop. This pass also implements the following extensions to the basic
12// algorithm:
13//
14// 1. Trivial instructions between the call and return do not prevent the
15// transformation from taking place, though currently the analysis cannot
16// support moving any really useful instructions (only dead ones).
17// 2. This pass transforms functions that are prevented from being tail
18// recursive by an associative and commutative expression to use an
19// accumulator variable, thus compiling the typical naive factorial or
20// 'fib' implementation into efficient code.
21// 3. TRE is performed if the function returns void, if the return
22// returns the result returned by the call, or if the function returns a
23// run-time constant on all exits from the function. It is possible, though
24// unlikely, that the return returns something else (like constant 0), and
25// can still be TRE'd. It can be TRE'd if ALL OTHER return instructions in
26// the function return the exact same value.
27// 4. If it can prove that callees do not access their caller stack frame,
28// they are marked as eligible for tail call elimination (by the code
29// generator).
30//
31// There are several improvements that could be made:
32//
33// 1. If the function has any alloca instructions, these instructions will be
34// moved out of the entry block of the function, causing them to be
35// evaluated each time through the tail recursion. Safely keeping allocas
36// in the entry block requires analysis to proves that the tail-called
37// function does not read or write the stack object.
38// 2. Tail recursion is only performed if the call immediately precedes the
39// return instruction. It's possible that there could be a jump between
40// the call and the return.
41// 3. There can be intervening operations between the call and the return that
42// prevent the TRE from occurring. For example, there could be GEP's and
43// stores to memory that will not be read or written by the call. This
44// requires some substantial analysis (such as with DSA) to prove safe to
45// move ahead of the call, but doing so could allow many more TREs to be
46// performed, for example in TreeAdd/TreeAlloc from the treeadd benchmark.
47// 4. The algorithm we use to detect if callees access their caller stack
48// frames is very primitive.
49//
50//===----------------------------------------------------------------------===//
51
53#include "llvm/ADT/STLExtras.h"
55#include "llvm/ADT/Statistic.h"
60#include "llvm/Analysis/Loads.h"
66#include "llvm/IR/CFG.h"
67#include "llvm/IR/Constants.h"
68#include "llvm/IR/DataLayout.h"
71#include "llvm/IR/Dominators.h"
72#include "llvm/IR/Function.h"
73#include "llvm/IR/IRBuilder.h"
77#include "llvm/IR/Module.h"
79#include "llvm/Pass.h"
81#include "llvm/Support/Debug.h"
85#include <cmath>
86using namespace llvm;
87
88#define DEBUG_TYPE "tailcallelim"
89
90STATISTIC(NumEliminated, "Number of tail calls removed");
91STATISTIC(NumRetDuped, "Number of return duplicated");
92STATISTIC(NumAccumAdded, "Number of accumulators introduced");
93STATISTIC(NumTREPreventedCold,
94 "Number of tail calls/recursion eliminations prevented due to cold "
95 "calling convention or attribute");
96
98 "tre-disable-entrycount-recompute", cl::init(false), cl::Hidden,
99 cl::desc("Force disabling recomputing of function entry count, on "
100 "successful tail recursion elimination."));
101
103 "disable-tail-call-elim-for-cold-calls", cl::Hidden, cl::init(false),
104 cl::desc("Disable tail call elimination and optimization for cold calls or "
105 "in cold functions"));
106
108 const Function *Caller,
109 const ProfileSummaryInfo *PSI,
110 BlockFrequencyInfo *BFI) {
112 return false;
113
114 if (CB && CB->isMustTailCall())
115 return false;
116
117 if (Caller && (Caller->hasFnAttribute(Attribute::Cold) ||
118 Caller->getCallingConv() == CallingConv::Cold))
119 return true;
120
121 if (!PSI || !PSI->hasProfileSummary())
122 return false;
123
124 // We require both the function entry and the call site/block/callee to be
125 // cold.
126 // 1. Checking that the function entry is cold ensures we don't disable tail
127 // call elimination in hot functions (with calls on cold conditional
128 // paths), which would force stack frame setup and teardown on hot paths.
129 // 2. Checking that the call site/block/callee is also cold ensures that if a
130 // function has a cold entry count but contains a hot loop, we don't
131 // disable tail call elimination for calls within that hot loop.
132 if (Caller && PSI->isFunctionEntryCold(Caller) && CB) {
133 if (CB->hasFnAttr(Attribute::Cold) ||
135 return true;
136 if (BFI && (PSI->isColdCallSite(*CB, BFI) ||
137 PSI->isColdBlock(CB->getParent(), BFI)))
138 return true;
139 }
140
141 return false;
142}
143
144/// Scan the specified function for alloca instructions.
145/// If it contains any dynamic allocas, returns false.
146static bool canTRE(Function &F) {
147 // TODO: We don't do TRE if dynamic allocas are used.
148 // Dynamic allocas allocate stack space which should be
149 // deallocated before new iteration started. That is
150 // currently not implemented.
151 return llvm::all_of(instructions(F), [](Instruction &I) {
152 auto *AI = dyn_cast<AllocaInst>(&I);
153 return !AI || AI->isStaticAlloca();
154 });
155}
156
157namespace {
158struct AllocaDerivedValueTracker {
159 // Start at a root value and walk its use-def chain to mark calls that use the
160 // value or a derived value in AllocaUsers, and places where it may escape in
161 // EscapePoints.
162 void walk(Value *Root) {
163 SmallVector<Use *, 32> Worklist;
164 SmallPtrSet<Use *, 32> Visited;
165
166 auto AddUsesToWorklist = [&](Value *V) {
167 for (auto &U : V->uses()) {
168 if (!Visited.insert(&U).second)
169 continue;
170 Worklist.push_back(&U);
171 }
172 };
173
174 AddUsesToWorklist(Root);
175
176 while (!Worklist.empty()) {
177 Use *U = Worklist.pop_back_val();
178 Instruction *I = cast<Instruction>(U->getUser());
179
180 switch (I->getOpcode()) {
181 case Instruction::Call:
182 case Instruction::Invoke: {
183 auto &CB = cast<CallBase>(*I);
184 // If the alloca-derived argument is passed byval it is not an escape
185 // point, or a use of an alloca. Calling with byval copies the contents
186 // of the alloca into argument registers or stack slots, which exist
187 // beyond the lifetime of the current frame.
188 if (CB.isArgOperand(U) && CB.isByValArgument(CB.getArgOperandNo(U)))
189 continue;
190 bool IsNocapture =
191 CB.isDataOperand(U) && CB.doesNotCapture(CB.getDataOperandNo(U));
192 callUsesLocalStack(CB, IsNocapture);
193 if (IsNocapture) {
194 // If the alloca-derived argument is passed in as nocapture, then it
195 // can't propagate to the call's return. That would be capturing.
196 continue;
197 }
198 break;
199 }
200 case Instruction::Load: {
201 // The result of a load is not alloca-derived (unless an alloca has
202 // otherwise escaped, but this is a local analysis).
203 continue;
204 }
205 case Instruction::Store: {
206 if (U->getOperandNo() == 0)
207 EscapePoints.insert(I);
208 continue; // Stores have no users to analyze.
209 }
210 case Instruction::BitCast:
211 case Instruction::GetElementPtr:
212 case Instruction::PHI:
213 case Instruction::Select:
214 case Instruction::AddrSpaceCast:
215 break;
216 default:
217 EscapePoints.insert(I);
218 break;
219 }
220
221 AddUsesToWorklist(I);
222 }
223 }
224
225 void callUsesLocalStack(CallBase &CB, bool IsNocapture) {
226 // Add it to the list of alloca users.
227 AllocaUsers.insert(&CB);
228
229 // If it's nocapture then it can't capture this alloca.
230 if (IsNocapture)
231 return;
232
233 // If it can write to memory, it can leak the alloca value.
234 if (!CB.onlyReadsMemory())
235 EscapePoints.insert(&CB);
236 }
237
238 SmallPtrSet<Instruction *, 32> AllocaUsers;
239 SmallPtrSet<Instruction *, 32> EscapePoints;
240};
241} // namespace
242
245 if (F.callsFunctionThatReturnsTwice())
246 return false;
247
248 // The local stack holds all alloca instructions and all byval arguments.
249 AllocaDerivedValueTracker Tracker;
250 for (Argument &Arg : F.args()) {
251 if (Arg.hasByValAttr())
252 Tracker.walk(&Arg);
253 }
254 for (auto &BB : F) {
255 for (auto &I : BB)
257 Tracker.walk(AI);
258 }
259
260 bool Modified = false;
261
262 // Track whether a block is reachable after an alloca has escaped. Blocks that
263 // contain the escaping instruction will be marked as being visited without an
264 // escaped alloca, since that is how the block began.
265 enum VisitType {
266 UNVISITED,
267 UNESCAPED,
268 ESCAPED
269 };
271
272 // We propagate the fact that an alloca has escaped from block to successor.
273 // Visit the blocks that are propagating the escapedness first. To do this, we
274 // maintain two worklists.
275 SmallVector<BasicBlock *, 32> WorklistUnescaped, WorklistEscaped;
276
277 // We may enter a block and visit it thinking that no alloca has escaped yet,
278 // then see an escape point and go back around a loop edge and come back to
279 // the same block twice. Because of this, we defer setting tail on calls when
280 // we first encounter them in a block. Every entry in this list does not
281 // statically use an alloca via use-def chain analysis, but may find an alloca
282 // through other means if the block turns out to be reachable after an escape
283 // point.
284 SmallVector<CallInst *, 32> DeferredTails;
285
286 BasicBlock *BB = &F.getEntryBlock();
287 VisitType Escaped = UNESCAPED;
288 do {
289 for (auto &I : *BB) {
290 if (Tracker.EscapePoints.count(&I))
291 Escaped = ESCAPED;
292
294 // A PseudoProbeInst has the IntrInaccessibleMemOnly tag hence it is
295 // considered accessing memory and will be marked as a tail call if we
296 // don't bail out here.
297 if (!CI || CI->isTailCall() || isa<PseudoProbeInst>(&I))
298 continue;
299
300 // Bail out for intrinsic stackrestore call because it can modify
301 // unescaped allocas.
302 if (auto *II = dyn_cast<IntrinsicInst>(CI))
303 if (II->getIntrinsicID() == Intrinsic::stackrestore)
304 continue;
305
306 // Special-case operand bundles "clang.arc.attachedcall", "ptrauth", and
307 // "kcfi".
308 bool DisableForCold = shouldDisableTailCallsForCold(CI, &F, PSI, BFI);
309 bool IsNoTail = CI->isNoTailCall() || DisableForCold ||
313 if (!CI->isNoTailCall() && DisableForCold)
314 ++NumTREPreventedCold;
315
316 if (!IsNoTail && CI->doesNotAccessMemory()) {
317 // A call to a readnone function whose arguments are all things computed
318 // outside this function can be marked tail. Even if you stored the
319 // alloca address into a global, a readnone function can't load the
320 // global anyhow.
321 //
322 // Note that this runs whether we know an alloca has escaped or not. If
323 // it has, then we can't trust Tracker.AllocaUsers to be accurate.
324 bool SafeToTail = true;
325 for (auto &Arg : CI->args()) {
326 if (isa<Constant>(Arg.getUser()))
327 continue;
328 if (Argument *A = dyn_cast<Argument>(Arg.getUser()))
329 if (!A->hasByValAttr())
330 continue;
331 SafeToTail = false;
332 break;
333 }
334 if (SafeToTail) {
335 using namespace ore;
336 ORE->emit([&]() {
337 return OptimizationRemark(DEBUG_TYPE, "tailcall-readnone", CI)
338 << "marked as tail call candidate (readnone)";
339 });
340 CI->setTailCall();
341 Modified = true;
342 continue;
343 }
344 }
345
346 if (!IsNoTail && Escaped == UNESCAPED && !Tracker.AllocaUsers.count(CI))
347 DeferredTails.push_back(CI);
348 }
349
350 for (auto *SuccBB : successors(BB)) {
351 auto &State = Visited[SuccBB];
352 if (State < Escaped) {
353 State = Escaped;
354 if (State == ESCAPED)
355 WorklistEscaped.push_back(SuccBB);
356 else
357 WorklistUnescaped.push_back(SuccBB);
358 }
359 }
360
361 if (!WorklistEscaped.empty()) {
362 BB = WorklistEscaped.pop_back_val();
363 Escaped = ESCAPED;
364 } else {
365 BB = nullptr;
366 while (!WorklistUnescaped.empty()) {
367 auto *NextBB = WorklistUnescaped.pop_back_val();
368 if (Visited[NextBB] == UNESCAPED) {
369 BB = NextBB;
370 Escaped = UNESCAPED;
371 break;
372 }
373 }
374 }
375 } while (BB);
376
377 for (CallInst *CI : DeferredTails) {
378 if (Visited[CI->getParent()] != ESCAPED) {
379 // If the escape point was part way through the block, calls after the
380 // escape point wouldn't have been put into DeferredTails.
381 LLVM_DEBUG(dbgs() << "Marked as tail call candidate: " << *CI << "\n");
382 CI->setTailCall();
383 Modified = true;
384 }
385 }
386
387 return Modified;
388}
389
390/// Return true if it is safe to move the specified
391/// instruction from after the call to before the call, assuming that all
392/// instructions between the call and this instruction are movable.
393///
396 if (II->getIntrinsicID() == Intrinsic::lifetime_end)
397 return true;
398
399 // FIXME: We can move load/store/call/free instructions above the call if the
400 // call does not mod/ref the memory location being processed.
401 if (I->mayHaveSideEffects()) // This also handles volatile loads.
402 return false;
403
404 if (LoadInst *L = dyn_cast<LoadInst>(I)) {
405 // Loads may always be moved above calls without side effects.
406 if (CI->mayHaveSideEffects()) {
407 // Non-volatile loads may be moved above a call with side effects if it
408 // does not write to memory and the load provably won't trap.
409 // Writes to memory only matter if they may alias the pointer
410 // being loaded from.
411 const DataLayout &DL = L->getDataLayout();
412 if (isModSet(AA->getModRefInfo(CI, MemoryLocation::get(L))) ||
413 !isSafeToLoadUnconditionally(L->getPointerOperand(), L->getType(),
414 L->getAlign(), DL, L))
415 return false;
416 }
417 }
418
419 // Otherwise, if this is a side-effect free instruction, check to make sure
420 // that it does not use the return value of the call. If it doesn't use the
421 // return value of the call, it must only use things that are defined before
422 // the call, or movable instructions between the call and the instruction
423 // itself.
424 return !is_contained(I->operands(), CI);
425}
426
427// Return true if I is a unary accumulator recurrence: a chain of
428// applications of a unary function `g` composed with itself,
429// `g(g(...g(Base)...))`, which is equivalent to a single application of the
430// N-times-composed function when `g` is pure. Neither associative nor
431// commutative, this differs from the ordinary accumulator recurrence handled
432// below, which requires I to be associative and commutative.
433//
434// TODO: Generalize this beyond shifts by a constant amount to arbitrary pure
435// unary functions (e.g., `f(x) = x == 0 ? Base : g(f(x - 1))` for any pure
436// unary `g`).
438 if (!I->isShift())
439 return false;
440
441 // A chain of shifts by a constant amount C is equivalent to a single shift
442 // by the sum of the amounts:
443 // ... (Base << C) << C) ... << C == Base << (C * Iterations)
444 // This relation applies to left shifts as well as arithmetic/logical right
445 // shifts when the shift amount is a constant.
446 return isa<ConstantInt>(I->getOperand(1));
447}
448
449// Find the base-case return value for function F, given the accumulator
450// recursion instruction AccRecInstr that is about to be eliminated. Every
451// return other than the one fed by AccRecInstr survives the transformation and
452// will be rewritten to return the accumulator, so all of them have to yield the
453// same base-case constant. Return that constant, or nullptr on failure.
454//
455// FIXME: There is a room for improvement here in the future, e.g., consider
456// non-constant values and multiple base cases -- e.g., we want to be able to
457// handle code like:
458// ```
459// int f(int x) {
460// if (x == 1) return 1;
461// if (x == 10) return 10;
462// return f(x-1) << 1;
463// }
464// ```
466 Instruction *AccRecInstr) {
467 Constant *BaseCaseVal = nullptr;
468
469 for (BasicBlock &BB : F) {
470 auto *RI = dyn_cast<ReturnInst>(BB.getTerminator());
471 if (!RI || !RI->getReturnValue())
472 continue;
473
474 Value *RV = RI->getReturnValue();
475
476 // This is the recursive case being turned into a loop: the return goes
477 // away along with AccRecInstr.
478 if (RV == AccRecInstr)
479 continue;
480
481 // Anything else has to be the base case. In particular a return still
482 // computing from a recursive call (e.g. a second recursion site that is
483 // not eliminated) must be rejected: returning the accumulator in its place
484 // would drop that computation.
485 auto *C = dyn_cast<Constant>(RV);
486 if (!C)
487 return nullptr;
488
489 if (!BaseCaseVal)
490 BaseCaseVal = C;
491 else if (BaseCaseVal != C)
492 return nullptr;
493 }
494
495 return BaseCaseVal;
496}
497
498// This function checks whether the instruction I can be used
499// to perform accumulator recursion elimination for the
500// call instruction CI.
502 CallInst *CI) {
503 bool IsUnaryAccumulatorRecurrence = isUnaryAccumulatorRecurrence(I);
504 if ((!I->isAssociative() || !I->isCommutative()) &&
505 !IsUnaryAccumulatorRecurrence)
506 return nullptr;
507
508 assert(I->getNumOperands() >= 2 &&
509 "Associative/commutative operations should have at least 2 args!");
510
511 Constant *AccInitVal = nullptr;
512 if (IsUnaryAccumulatorRecurrence) {
513 // For unary accumulator recurrences, we require that the recursive call
514 // is always on the first operand.
515 if (I->getOperand(0) != CI)
516 return nullptr;
517
518 // findTRECandidate guarantees CI is a recursive call to its own
519 // function, so scan the enclosing function for the base-case return.
520 AccInitVal = findBaseCaseRetConstant(*CI->getFunction(), /*AccRecInstr=*/I);
521 if (!AccInitVal)
522 return nullptr;
523 } else {
524 AccInitVal = ConstantExpr::getIdentity(I, I->getType());
525 if (!AccInitVal)
526 return nullptr;
527
528 // Exactly one operand should be the result of the call instruction.
529 if ((I->getOperand(0) == CI && I->getOperand(1) == CI) ||
530 (I->getOperand(0) != CI && I->getOperand(1) != CI))
531 return nullptr;
532 }
533
534 // The only user of this instruction we allow is a single return instruction.
535 if (!I->hasOneUse() || !isa<ReturnInst>(I->user_back()))
536 return nullptr;
537
538 return AccInitVal;
539}
540
541namespace {
542class TailRecursionEliminator {
543 Function &F;
544 const TargetTransformInfo *TTI;
545 AliasAnalysis *AA;
546 OptimizationRemarkEmitter *ORE;
547 DomTreeUpdater &DTU;
548 BlockFrequencyInfo *const BFI;
549 ProfileSummaryInfo *const PSI;
550 const bool UpdateFunctionEntryCount;
551 const uint64_t OrigEntryBBFreq;
552 const uint64_t OrigEntryCount;
553
554 // The below are shared state we want to have available when eliminating any
555 // calls in the function. There values should be populated by
556 // createTailRecurseLoopHeader the first time we find a call we can eliminate.
557 BasicBlock *HeaderBB = nullptr;
558 SmallVector<PHINode *, 8> ArgumentPHIs;
559
560 // PHI node to store our return value.
561 PHINode *RetPN = nullptr;
562
563 // i1 PHI node to track if we have a valid return value stored in RetPN.
564 PHINode *RetKnownPN = nullptr;
565
566 // Vector of select instructions we insereted. These selects use RetKnownPN
567 // to either propagate RetPN or select a new return value.
569
570 // The below are shared state needed when performing accumulator recursion.
571 // There values should be populated by insertAccumulator the first time we
572 // find an elimination that requires an accumulator.
573
574 // PHI node to store our current accumulated value.
575 PHINode *AccPN = nullptr;
576
577 // The instruction doing the accumulating.
578 Instruction *AccumulatorRecursionInstr = nullptr;
579
580 Constant *AccumulatorInitialValue = nullptr;
581
582 TailRecursionEliminator(Function &F, const TargetTransformInfo *TTI,
583 AliasAnalysis *AA, OptimizationRemarkEmitter *ORE,
584 DomTreeUpdater &DTU, BlockFrequencyInfo *BFI,
585 ProfileSummaryInfo *PSI,
586 bool UpdateFunctionEntryCount)
587 : F(F), TTI(TTI), AA(AA), ORE(ORE), DTU(DTU), BFI(BFI), PSI(PSI),
588 UpdateFunctionEntryCount(UpdateFunctionEntryCount),
589 OrigEntryBBFreq(
590 BFI ? BFI->getBlockFreq(&F.getEntryBlock()).getFrequency() : 0U),
591 OrigEntryCount(F.getEntryCount() ? *F.getEntryCount() : 0) {
592 if (BFI) {
593 // The assert is meant as API documentation for the caller.
594 assert(OrigEntryBBFreq != 0 &&
595 "If a BFI was provided, the function should have an entry "
596 "basic block with a non-zero frequency.");
597 }
598 }
599
600 CallInst *findTRECandidate(BasicBlock *BB);
601
602 void createTailRecurseLoopHeader(CallInst *CI);
603
604 void insertAccumulator(Instruction *AccRecInstr);
605
606 bool eliminateCall(CallInst *CI);
607
608 void cleanupAndFinalize();
609
610 bool processBlock(BasicBlock &BB);
611
612 void copyByValueOperandIntoLocalTemp(CallInst *CI, int OpndIdx);
613
614 void copyLocalTempOfByValueOperandIntoArguments(CallInst *CI, int OpndIdx);
615
616public:
617 static bool eliminate(Function &F, const TargetTransformInfo *TTI,
618 AliasAnalysis *AA, OptimizationRemarkEmitter *ORE,
619 DomTreeUpdater &DTU, BlockFrequencyInfo *BFI,
620 ProfileSummaryInfo *PSI, bool UpdateFunctionEntryCount);
621};
622} // namespace
623
624CallInst *TailRecursionEliminator::findTRECandidate(BasicBlock *BB) {
625 Instruction *TI = BB->getTerminator();
626
627 if (&BB->front() == TI) // Make sure there is something before the terminator.
628 return nullptr;
629
630 // Scan backwards from the return, checking to see if there is a tail call in
631 // this block. If so, set CI to it.
632 CallInst *CI = nullptr;
633 BasicBlock::iterator BBI(TI);
634 while (true) {
635 CI = dyn_cast<CallInst>(BBI);
636 if (CI && CI->getCalledFunction() == &F)
637 break;
638
639 if (BBI == BB->begin())
640 return nullptr; // Didn't find a potential tail call.
641 --BBI;
642 }
643
644 assert((!CI->isTailCall() || !CI->isNoTailCall()) &&
645 "Incompatible call site attributes(Tail,NoTail)");
646 if (!CI->isTailCall() || shouldDisableTailCallsForCold(CI, &F, PSI, BFI))
647 return nullptr;
648
649 // As a special case, detect code like this:
650 // double fabs(double f) { return __builtin_fabs(f); } // a 'fabs' call
651 // and disable this xform in this case, because the code generator will
652 // lower the call to fabs into inline code.
653 if (BB == &F.getEntryBlock() && &BB->front() == CI &&
654 &*std::next(BB->begin()) == TI && CI->getCalledFunction() &&
656 // A single-block function with just a call and a return. Check that
657 // the arguments match.
658 auto I = CI->arg_begin(), E = CI->arg_end();
659 Function::arg_iterator FI = F.arg_begin(), FE = F.arg_end();
660 for (; I != E && FI != FE; ++I, ++FI)
661 if (*I != &*FI) break;
662 if (I == E && FI == FE)
663 return nullptr;
664 }
665
666 return CI;
667}
668
669void TailRecursionEliminator::createTailRecurseLoopHeader(CallInst *CI) {
670 HeaderBB = &F.getEntryBlock();
671 BasicBlock *NewEntry = BasicBlock::Create(F.getContext(), "", &F, HeaderBB);
672 NewEntry->takeName(HeaderBB);
673 HeaderBB->setName("tailrecurse");
674 auto *BI = UncondBrInst::Create(HeaderBB, NewEntry);
675 BI->setDebugLoc(DebugLoc::getCompilerGenerated());
676 // If the new branch preserves the debug location of CI, it could result in
677 // misleading stepping, if CI is located in a conditional branch.
678 // So, here we don't give any debug location to the new branch.
679
680 // Move all fixed sized allocas from HeaderBB to NewEntry.
681 for (BasicBlock::iterator OEBI = HeaderBB->begin(), E = HeaderBB->end(),
682 NEBI = NewEntry->begin();
683 OEBI != E;)
684 if (AllocaInst *AI = dyn_cast<AllocaInst>(OEBI++))
685 if (isa<ConstantInt>(AI->getArraySize()))
686 AI->moveBefore(NEBI);
687
688 // Now that we have created a new block, which jumps to the entry
689 // block, insert a PHI node for each argument of the function.
690 // For now, we initialize each PHI to only have the real arguments
691 // which are passed in.
692 BasicBlock::iterator InsertPos = HeaderBB->begin();
693 for (Function::arg_iterator I = F.arg_begin(), E = F.arg_end(); I != E; ++I) {
694 PHINode *PN = PHINode::Create(I->getType(), 2, I->getName() + ".tr");
695 PN->insertBefore(InsertPos);
696 I->replaceAllUsesWith(PN); // Everyone use the PHI node now!
697 PN->addIncoming(&*I, NewEntry);
698 ArgumentPHIs.push_back(PN);
699 }
700
701 // If the function doen't return void, create the RetPN and RetKnownPN PHI
702 // nodes to track our return value. We initialize RetPN with poison and
703 // RetKnownPN with false since we can't know our return value at function
704 // entry.
705 Type *RetType = F.getReturnType();
706 if (!RetType->isVoidTy()) {
707 Type *BoolType = Type::getInt1Ty(F.getContext());
708 RetPN = PHINode::Create(RetType, 2, "ret.tr");
709 RetPN->insertBefore(InsertPos);
710 RetKnownPN = PHINode::Create(BoolType, 2, "ret.known.tr");
711 RetKnownPN->insertBefore(InsertPos);
712
713 RetPN->addIncoming(PoisonValue::get(RetType), NewEntry);
714 RetKnownPN->addIncoming(ConstantInt::getFalse(BoolType), NewEntry);
715 }
716
717 // The entry block was changed from HeaderBB to NewEntry.
718 // The forward DominatorTree needs to be recalculated when the EntryBB is
719 // changed. In this corner-case we recalculate the entire tree.
720 DTU.recalculate(*NewEntry->getParent());
721}
722
723void TailRecursionEliminator::insertAccumulator(Instruction *AccRecInstr) {
724 assert(!AccPN && "Trying to insert multiple accumulators");
725
726 AccumulatorRecursionInstr = AccRecInstr;
727
728 // Start by inserting a new PHI node for the accumulator.
729 pred_iterator PB = pred_begin(HeaderBB), PE = pred_end(HeaderBB);
730 AccPN = PHINode::Create(F.getReturnType(), std::distance(PB, PE) + 1,
731 "accumulator.tr");
732 AccPN->insertBefore(HeaderBB->begin());
733
734 // Loop over all of the predecessors of the tail recursion block. For the
735 // real entry into the function we seed the PHI with the identity constant for
736 // the accumulation operation. For any other existing branches to this block
737 // (due to other tail recursions eliminated) the accumulator is not modified.
738 // Because we haven't added the branch in the current block to HeaderBB yet,
739 // it will not show up as a predecessor.
740 for (pred_iterator PI = PB; PI != PE; ++PI) {
741 BasicBlock *P = *PI;
742 if (P == &F.getEntryBlock()) {
743 AccPN->addIncoming(AccumulatorInitialValue, P);
744 } else {
745 AccPN->addIncoming(AccPN, P);
746 }
747 }
748
749 ++NumAccumAdded;
750}
751
752// Creates a copy of contents of ByValue operand of the specified
753// call instruction into the newly created temporarily variable.
754void TailRecursionEliminator::copyByValueOperandIntoLocalTemp(CallInst *CI,
755 int OpndIdx) {
756 Type *AggTy = CI->getParamByValType(OpndIdx);
757 assert(AggTy);
758 const DataLayout &DL = F.getDataLayout();
759
760 // Get alignment of byVal operand.
761 Align Alignment(CI->getParamAlign(OpndIdx).valueOrOne());
762
763 // Create alloca for temporarily byval operands.
764 // Put alloca into the entry block.
765 Value *NewAlloca = new AllocaInst(
766 AggTy, DL.getAllocaAddrSpace(), nullptr, Alignment,
767 CI->getArgOperand(OpndIdx)->getName(), F.getEntryBlock().begin());
768
769 IRBuilder<> Builder(CI);
770 Value *Size = Builder.getInt64(DL.getTypeAllocSize(AggTy));
771
772 // Copy data from byvalue operand into the temporarily variable.
773 Builder.CreateMemCpy(NewAlloca, /*DstAlign*/ Alignment,
774 CI->getArgOperand(OpndIdx),
775 /*SrcAlign*/ Alignment, Size);
776 CI->setArgOperand(OpndIdx, NewAlloca);
777}
778
779// Creates a copy from temporarily variable(keeping value of ByVal argument)
780// into the corresponding function argument location.
781void TailRecursionEliminator::copyLocalTempOfByValueOperandIntoArguments(
782 CallInst *CI, int OpndIdx) {
783 Type *AggTy = CI->getParamByValType(OpndIdx);
784 assert(AggTy);
785 const DataLayout &DL = F.getDataLayout();
786
787 // Get alignment of byVal operand.
788 Align Alignment(CI->getParamAlign(OpndIdx).valueOrOne());
789
790 IRBuilder<> Builder(CI);
791 Value *Size = Builder.getInt64(DL.getTypeAllocSize(AggTy));
792
793 // Copy data from the temporarily variable into corresponding
794 // function argument location.
795 Builder.CreateMemCpy(F.getArg(OpndIdx), /*DstAlign*/ Alignment,
796 CI->getArgOperand(OpndIdx),
797 /*SrcAlign*/ Alignment, Size);
798}
799
800bool TailRecursionEliminator::eliminateCall(CallInst *CI) {
801 ReturnInst *Ret = cast<ReturnInst>(CI->getParent()->getTerminator());
802
803 // Ok, we found a potential tail call. We can currently only transform the
804 // tail call if all of the instructions between the call and the return are
805 // movable to above the call itself, leaving the call next to the return.
806 // Check that this is the case now.
807 Instruction *AccRecInstr = nullptr;
808 BasicBlock::iterator BBI(CI);
809 for (++BBI; &*BBI != Ret; ++BBI) {
810 if (canMoveAboveCall(&*BBI, CI, AA))
811 continue;
812
813 // If we can't move the instruction above the call, it might be because it
814 // is an (associative and commutative) or unary accumulator recurrence
815 // arithmetic operation that could be transformed using accumulator
816 // recursion elimination. Check to see if this is the case, and if so,
817 // remember which instruction accumulates for later.
818 Constant *AccInitVal = canTransformAccumulatorRecursion(&*BBI, CI);
819
820 if (AccPN || !AccInitVal)
821 return false; // We cannot eliminate the tail recursion!
822
823 // Yes, this is accumulator recursion. Remember which instruction
824 // accumulates.
825 AccRecInstr = &*BBI;
826
827 // Keep track of the base case (i.e., initial value) of the accumulator
828 // return value if any.
829 AccumulatorInitialValue = AccInitVal;
830 }
831
832 BasicBlock *BB = Ret->getParent();
833
834 using namespace ore;
835 ORE->emit([&]() {
836 return OptimizationRemark(DEBUG_TYPE, "tailcall-recursion", CI)
837 << "transforming tail recursion into loop";
838 });
839
840 // OK! We can transform this tail call. If this is the first one found,
841 // create the new entry block, allowing us to branch back to the old entry.
842 if (!HeaderBB)
843 createTailRecurseLoopHeader(CI);
844
845 // Copy values of ByVal operands into local temporarily variables.
846 for (unsigned I = 0, E = CI->arg_size(); I != E; ++I) {
847 if (CI->isByValArgument(I))
848 copyByValueOperandIntoLocalTemp(CI, I);
849 }
850
851 // Ok, now that we know we have a pseudo-entry block WITH all of the
852 // required PHI nodes, add entries into the PHI node for the actual
853 // parameters passed into the tail-recursive call.
854 for (unsigned I = 0, E = CI->arg_size(); I != E; ++I) {
855 if (CI->isByValArgument(I)) {
856 copyLocalTempOfByValueOperandIntoArguments(CI, I);
857 // When eliminating a tail call, we modify the values of the arguments.
858 // Therefore, if the byval parameter has a readonly attribute, we have to
859 // remove it. It is safe because, from the perspective of a caller, the
860 // byval parameter is always treated as "readonly," even if the readonly
861 // attribute is removed.
862 F.removeParamAttr(I, Attribute::ReadOnly);
863 ArgumentPHIs[I]->addIncoming(F.getArg(I), BB);
864 } else
865 ArgumentPHIs[I]->addIncoming(CI->getArgOperand(I), BB);
866 }
867
868 if (AccRecInstr) {
869 insertAccumulator(AccRecInstr);
870
871 // Rewrite the accumulator recursion instruction so that it does not use
872 // the result of the call anymore, instead, use the PHI node we just
873 // inserted.
874 AccRecInstr->setOperand(AccRecInstr->getOperand(0) != CI, AccPN);
875
876 // Reassociating into the loop reorders the operands, so flags from the
877 // original order (nsw/nuw/exact/...) may no longer hold.
878 AccRecInstr->dropPoisonGeneratingFlags();
879 }
880
881 // Update our return value tracking
882 if (RetPN) {
883 if (Ret->getReturnValue() == CI || AccRecInstr) {
884 // Defer selecting a return value
885 RetPN->addIncoming(RetPN, BB);
886 RetKnownPN->addIncoming(RetKnownPN, BB);
887 } else {
888 // We found a return value we want to use, insert a select instruction to
889 // select it if we don't already know what our return value will be and
890 // store the result in our return value PHI node.
891 SelectInst *SI =
892 SelectInst::Create(RetKnownPN, RetPN, Ret->getReturnValue(),
893 "current.ret.tr", Ret->getIterator());
894 SI->setDebugLoc(Ret->getDebugLoc());
895 RetSelects.push_back(SI);
896
897 RetPN->addIncoming(SI, BB);
898 RetKnownPN->addIncoming(ConstantInt::getTrue(RetKnownPN->getType()), BB);
899 }
900
901 if (AccPN)
902 AccPN->addIncoming(AccRecInstr ? AccRecInstr : AccPN, BB);
903 }
904
905 // Now that all of the PHI nodes are in place, remove the call and
906 // ret instructions, replacing them with an unconditional branch.
907 UncondBrInst *NewBI = UncondBrInst::Create(HeaderBB, Ret->getIterator());
908 NewBI->setDebugLoc(CI->getDebugLoc());
909
910 Ret->eraseFromParent(); // Remove return.
911 CI->eraseFromParent(); // Remove call.
912 DTU.applyUpdates({{DominatorTree::Insert, BB, HeaderBB}});
913 ++NumEliminated;
914 if (!DisableEntryCountRecompute && UpdateFunctionEntryCount &&
915 OrigEntryBBFreq) {
916 assert(F.getEntryCount().has_value());
917 // This pass is not expected to remove BBs, only add an entry BB. For that
918 // reason, and because the BB here isn't the new entry BB, the BFI lookup is
919 // expected to succeed.
920 assert(&F.getEntryBlock() != BB);
921 auto RelativeBBFreq =
922 static_cast<double>(BFI->getBlockFreq(BB).getFrequency()) /
923 static_cast<double>(OrigEntryBBFreq);
924 auto ToSubtract =
925 static_cast<uint64_t>(std::round(RelativeBBFreq * OrigEntryCount));
926 auto OldEntryCount = *F.getEntryCount();
927 if (OldEntryCount <= ToSubtract) {
929 errs() << "[TRE] The entrycount attributable to the recursive call, "
930 << ToSubtract
931 << ", should be strictly lower than the function entry count, "
932 << OldEntryCount << "\n");
933 } else {
934 F.setEntryCount(OldEntryCount - ToSubtract);
935 }
936 }
937 return true;
938}
939
940void TailRecursionEliminator::cleanupAndFinalize() {
941 // If we eliminated any tail recursions, it's possible that we inserted some
942 // silly PHI nodes which just merge an initial value (the incoming operand)
943 // with themselves. Check to see if we did and clean up our mess if so. This
944 // occurs when a function passes an argument straight through to its tail
945 // call.
946 for (PHINode *PN : ArgumentPHIs) {
947 // If the PHI Node is a dynamic constant, replace it with the value it is.
948 if (Value *PNV = simplifyInstruction(PN, F.getDataLayout())) {
949 PN->replaceAllUsesWith(PNV);
950 PN->eraseFromParent();
951 }
952 }
953
954 if (RetPN) {
955 Instruction *AccRecInstr = AccumulatorRecursionInstr;
956 auto MaterializeAccumulator = [&](Value *OtherVal,
957 BasicBlock::iterator InsertPt) {
958 Instruction *New = AccRecInstr->clone();
959 New->setName("accumulator.ret.tr");
960 New->setOperand(AccRecInstr->getOperand(0) == AccPN, OtherVal);
961 New->insertBefore(InsertPt);
962 New->dropLocation();
963 return New;
964 };
965
966 if (RetSelects.empty()) {
967 // If we didn't insert any select instructions, then we know we didn't
968 // store a return value and we can remove the PHI nodes we inserted.
969 RetPN->dropAllReferences();
970 RetPN->eraseFromParent();
971
972 RetKnownPN->dropAllReferences();
973 RetKnownPN->eraseFromParent();
974
975 if (AccPN) {
976 // We need to insert a copy of our accumulator instruction before any
977 // return in the function, and return its result instead.
978 for (BasicBlock &BB : F) {
979 ReturnInst *RI = dyn_cast<ReturnInst>(BB.getTerminator());
980 if (!RI)
981 continue;
982
983 if (isUnaryAccumulatorRecurrence(AccRecInstr)) {
984 // Base-case initialization: the accumulator PHI already holds the
985 // final result, so return it directly.
986 RI->setOperand(0, AccPN);
987 } else {
988 // Since the accumulator starts with the identity value, before the
989 // return we need to apply the accumulation instruction one more
990 // time to combine the last value with the result of the recursive
991 // call.
992 RI->setOperand(0, MaterializeAccumulator(RI->getOperand(0),
993 RI->getIterator()));
994 }
995 }
996 }
997 } else {
998 // We need to insert a select instruction before any return left in the
999 // function to select our stored return value if we have one.
1000 for (BasicBlock &BB : F) {
1001 ReturnInst *RI = dyn_cast<ReturnInst>(BB.getTerminator());
1002 if (!RI)
1003 continue;
1004
1005 SelectInst *SI =
1006 SelectInst::Create(RetKnownPN, RetPN, RI->getOperand(0),
1007 "current.ret.tr", RI->getIterator());
1008 SI->setDebugLoc(DebugLoc::getCompilerGenerated());
1009 RetSelects.push_back(SI);
1010 RI->setOperand(0, SI);
1011 }
1012
1013 if (AccPN) {
1014 // We need to insert a copy of our accumulator instruction before any
1015 // of the selects we inserted, and select its result instead.
1016 for (SelectInst *SI : RetSelects) {
1017 if (isUnaryAccumulatorRecurrence(AccRecInstr)) {
1018 SI->setFalseValue(AccPN);
1019 } else {
1020 SI->setFalseValue(
1021 MaterializeAccumulator(SI->getFalseValue(), SI->getIterator()));
1022 }
1023 }
1024 }
1025 }
1026 }
1027}
1028
1029bool TailRecursionEliminator::processBlock(BasicBlock &BB) {
1030 Instruction *TI = BB.getTerminator();
1031
1032 if (UncondBrInst *BI = dyn_cast<UncondBrInst>(TI)) {
1033 BasicBlock *Succ = BI->getSuccessor();
1034 ReturnInst *Ret = dyn_cast<ReturnInst>(Succ->getFirstNonPHIOrDbg(true));
1035
1036 if (!Ret)
1037 return false;
1038
1039 CallInst *CI = findTRECandidate(&BB);
1040
1041 if (!CI)
1042 return false;
1043
1044 LLVM_DEBUG(dbgs() << "FOLDING: " << *Succ
1045 << "INTO UNCOND BRANCH PRED: " << BB);
1046 FoldReturnIntoUncondBranch(Ret, Succ, &BB, &DTU);
1047 ++NumRetDuped;
1048
1049 // If all predecessors of Succ have been eliminated by
1050 // FoldReturnIntoUncondBranch, delete it. It is important to empty it,
1051 // because the ret instruction in there is still using a value which
1052 // eliminateCall will attempt to remove. This block can only contain
1053 // instructions that can't have uses, therefore it is safe to remove.
1054 if (pred_empty(Succ))
1055 DTU.deleteBB(Succ);
1056
1057 eliminateCall(CI);
1058 return true;
1059 }
1060
1061 if (isa<ReturnInst>(TI)) {
1062 CallInst *CI = findTRECandidate(&BB);
1063
1064 if (CI)
1065 return eliminateCall(CI);
1066 }
1067
1068 return false;
1069}
1070
1071bool TailRecursionEliminator::eliminate(
1072 Function &F, const TargetTransformInfo *TTI, AliasAnalysis *AA,
1073 OptimizationRemarkEmitter *ORE, DomTreeUpdater &DTU,
1074 BlockFrequencyInfo *BFI, ProfileSummaryInfo *PSI,
1075 bool UpdateFunctionEntryCount) {
1076 if (F.getFnAttribute("disable-tail-calls").getValueAsBool())
1077 return false;
1078
1079 bool MadeChange = false;
1080 MadeChange |= markTails(F, ORE, PSI, BFI);
1081
1082 // If this function is a varargs function, we won't be able to PHI the args
1083 // right, so don't even try to convert it...
1084 if (F.getFunctionType()->isVarArg())
1085 return MadeChange;
1086
1087 if (!canTRE(F))
1088 return MadeChange;
1089
1090 // Change any tail recursive calls to loops.
1091 TailRecursionEliminator TRE(F, TTI, AA, ORE, DTU, BFI, PSI,
1092 UpdateFunctionEntryCount);
1093
1094 for (BasicBlock &BB : F)
1095 MadeChange |= TRE.processBlock(BB);
1096
1097 TRE.cleanupAndFinalize();
1098
1099 return MadeChange;
1100}
1101
1102namespace {
1103struct TailCallElim : public FunctionPass {
1104 static char ID; // Pass identification, replacement for typeid
1105 TailCallElim() : FunctionPass(ID) {
1107 }
1108
1109 void getAnalysisUsage(AnalysisUsage &AU) const override {
1110 AU.addRequired<TargetTransformInfoWrapperPass>();
1111 AU.addRequired<AAResultsWrapperPass>();
1112 AU.addRequired<OptimizationRemarkEmitterWrapperPass>();
1113 AU.addPreserved<GlobalsAAWrapperPass>();
1114 AU.addPreserved<DominatorTreeWrapperPass>();
1115 AU.addPreserved<PostDominatorTreeWrapperPass>();
1116 }
1117
1118 bool runOnFunction(Function &F) override {
1119 if (skipFunction(F))
1120 return false;
1121
1122 auto *DTWP = getAnalysisIfAvailable<DominatorTreeWrapperPass>();
1123 auto *DT = DTWP ? &DTWP->getDomTree() : nullptr;
1124 auto *PDTWP = getAnalysisIfAvailable<PostDominatorTreeWrapperPass>();
1125 auto *PDT = PDTWP ? &PDTWP->getPostDomTree() : nullptr;
1126 // There is no noticable performance difference here between Lazy and Eager
1127 // UpdateStrategy based on some test results. It is feasible to switch the
1128 // UpdateStrategy to Lazy if we find it profitable later.
1129 DomTreeUpdater DTU(DT, PDT, DomTreeUpdater::UpdateStrategy::Eager);
1130
1131 return TailRecursionEliminator::eliminate(
1132 F, &getAnalysis<TargetTransformInfoWrapperPass>().getTTI(F),
1133 &getAnalysis<AAResultsWrapperPass>().getAAResults(),
1134 &getAnalysis<OptimizationRemarkEmitterWrapperPass>().getORE(), DTU,
1135 /*BFI=*/nullptr, /*PSI=*/nullptr, /*UpdateFunctionEntryCount=*/false);
1136 }
1137};
1138} // namespace
1139
1140char TailCallElim::ID = 0;
1141INITIALIZE_PASS_BEGIN(TailCallElim, "tailcallelim", "Tail Call Elimination",
1142 false, false)
1145INITIALIZE_PASS_END(TailCallElim, "tailcallelim", "Tail Call Elimination",
1147
1148// Public interface to the TailCallElimination pass
1150 return new TailCallElim();
1151}
1152
1155
1158 // This must come first. It needs the 2 analyses, meaning, if it came after
1159 // the lines asking for the cached result, should they be nullptr (which, in
1160 // the case of the PDT, is likely), updates to the trees would be missed.
1161 auto *BFI = F.getEntryCount().has_value()
1163 : nullptr;
1164 auto &MAMProxy = AM.getResult<ModuleAnalysisManagerFunctionProxy>(F);
1165 auto *PSI = MAMProxy.getCachedResult<ProfileSummaryAnalysis>(*F.getParent());
1167 auto *DT = AM.getCachedResult<DominatorTreeAnalysis>(F);
1169 // There is no noticable performance difference here between Lazy and Eager
1170 // UpdateStrategy based on some test results. It is feasible to switch the
1171 // UpdateStrategy to Lazy if we find it profitable later.
1172 DomTreeUpdater DTU(DT, PDT, DomTreeUpdater::UpdateStrategy::Eager);
1173 bool Changed = TailRecursionEliminator::eliminate(
1174 F, &TTI, &AA, &ORE, DTU, BFI, PSI, UpdateFunctionEntryCount);
1175
1176 if (!Changed)
1177 return PreservedAnalyses::all();
1181 return PA;
1182}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
Expand Atomic instructions
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
static bool runOnFunction(Function &F, bool PostInlining)
#define DEBUG_TYPE
This is the interface for a simple mod/ref and alias analysis over globals.
This file provides various utilities for inspecting and working with the control flow graph in LLVM I...
Module.h This file contains the declarations for the Module class.
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
uint64_t IntrinsicInst * II
#define P(N)
PassBuilder PB(Machine, PassOpts->PTO, std::nullopt, &PIC)
#define INITIALIZE_PASS_DEPENDENCY(depName)
Definition PassSupport.h:42
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
Definition PassSupport.h:44
#define INITIALIZE_PASS_BEGIN(passName, arg, name, cfg, analysis)
Definition PassSupport.h:39
This file contains some templates that are useful if you are working with the STL at all.
This file defines the SmallPtrSet 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:171
#define LLVM_DEBUG(...)
Definition Debug.h:119
static bool canTRE(Function &F)
Scan the specified function for alloca instructions.
static bool isUnaryAccumulatorRecurrence(Instruction *I)
static cl::opt< bool > DisableTailCallElimForColdCalls("disable-tail-call-elim-for-cold-calls", cl::Hidden, cl::init(false), cl::desc("Disable tail call elimination and optimization for cold calls or " "in cold functions"))
static bool canMoveAboveCall(Instruction *I, CallInst *CI, AliasAnalysis *AA)
Return true if it is safe to move the specified instruction from after the call to before the call,...
static cl::opt< bool > DisableEntryCountRecompute("tre-disable-entrycount-recompute", cl::init(false), cl::Hidden, cl::desc("Force disabling recomputing of function entry count, on " "successful tail recursion elimination."))
static bool markTails(Function &F, OptimizationRemarkEmitter *ORE, ProfileSummaryInfo *PSI, BlockFrequencyInfo *BFI)
static Constant * findBaseCaseRetConstant(Function &F, Instruction *AccRecInstr)
static Constant * canTransformAccumulatorRecursion(Instruction *I, CallInst *CI)
static bool shouldDisableTailCallsForCold(const CallBase *CB, const Function *Caller, const ProfileSummaryInfo *PSI, BlockFrequencyInfo *BFI)
This pass exposes codegen information to IR-level passes.
A manager for alias analyses.
an instruction to allocate memory on the stack
PassT::Result * getCachedResult(IRUnitT &IR) const
Get the cached result of an analysis pass for a given IR unit.
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
AnalysisUsage & addRequired()
AnalysisUsage & addPreserved()
Add the specified Pass class to the set of analyses preserved by this pass.
This class represents an incoming formal argument to a Function.
Definition Argument.h:32
LLVM Basic Block Representation.
Definition BasicBlock.h:62
iterator end()
Definition BasicBlock.h:459
iterator begin()
Instruction iterator methods.
Definition BasicBlock.h:446
const Function * getParent() const
Return the enclosing method, or null if none.
Definition BasicBlock.h:213
static BasicBlock * Create(LLVMContext &Context, const Twine &Name="", Function *Parent=nullptr, BasicBlock *InsertBefore=nullptr)
Creates a new BasicBlock.
Definition BasicBlock.h:206
LLVM_ABI InstListType::const_iterator getFirstNonPHIOrDbg(bool SkipPseudoOp=true) const
Returns a pointer to the first instruction in this block that is not a PHINode or a debug intrinsic,...
const Instruction & front() const
Definition BasicBlock.h:469
InstListType::iterator iterator
Instruction iterators...
Definition BasicBlock.h:170
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction; assumes that the block is well-formed.
Definition BasicBlock.h:237
Analysis pass which computes BlockFrequencyInfo.
BlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate IR basic block frequen...
LLVM_ABI BlockFrequency getBlockFreq(const BasicBlock *BB) const
getblockFreq - Return block frequency.
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
Function * getCalledFunction() const
Returns the function called, or null if this is an indirect function invocation or the function signa...
bool doesNotAccessMemory(unsigned OpNo) const
bool hasFnAttr(Attribute::AttrKind Kind) const
Determine whether this call has the given attribute.
CallingConv::ID getCallingConv() const
User::op_iterator arg_begin()
Return the iterator pointing to the beginning of the argument list.
LLVM_ABI bool isMustTailCall() const
Tests if this call site must be tail call optimized.
bool isByValArgument(unsigned ArgNo) const
Determine whether this argument is passed by value.
MaybeAlign getParamAlign(unsigned ArgNo) const
Extract the alignment for a call or parameter (0=unknown).
bool onlyReadsMemory(unsigned OpNo) const
Type * getParamByValType(unsigned ArgNo) const
Extract the byval type for a call or parameter.
bool hasOperandBundlesOtherThan(ArrayRef< uint32_t > IDs) const
Return true if this operand bundle user contains operand bundles with tags other than those specified...
Value * getArgOperand(unsigned i) const
void setArgOperand(unsigned i, Value *v)
User::op_iterator arg_end()
Return the iterator pointing to the end of the argument list.
iterator_range< User::op_iterator > args()
Iteration adapter for range-for loops.
unsigned arg_size() const
This class represents a function call, abstracting a target machine's calling convention.
bool isNoTailCall() const
bool isTailCall() const
void setTailCall(bool IsTc=true)
static LLVM_ABI Constant * getIdentity(Instruction *I, Type *Ty, bool AllowRHSConstant=false, bool NSZ=false)
Return the identity constant for a binary or intrinsic Instruction.
static LLVM_ABI ConstantInt * getTrue(LLVMContext &Context)
static LLVM_ABI ConstantInt * getFalse(LLVMContext &Context)
This is an important base class in LLVM.
Definition Constant.h:43
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
static DebugLoc getCompilerGenerated()
Definition DebugLoc.h:154
LLVM_ABI void deleteBB(BasicBlock *DelBB)
Delete DelBB.
Analysis pass which computes a DominatorTree.
Definition Dominators.h:241
FunctionPass class - This class is used to implement most global optimizations.
Definition Pass.h:314
Argument * arg_iterator
Definition Function.h:73
void applyUpdates(ArrayRef< UpdateT > Updates)
Submit updates to all available trees.
void recalculate(FuncT &F)
Notify DTU that the entry block was replaced.
LLVM_ABI Instruction * clone() const
Create a copy of 'this' instruction that is identical in all ways except the following:
const DebugLoc & getDebugLoc() const
Return the debug location for this node as a DebugLoc.
LLVM_ABI void insertBefore(InstListType::iterator InsertPos)
Insert an unlinked instruction into a basic block immediately before the specified position.
LLVM_ABI InstListType::iterator eraseFromParent()
This method unlinks 'this' from the containing basic block and deletes it.
LLVM_ABI const Function * getFunction() const
Return the function this instruction belongs to.
LLVM_ABI bool mayHaveSideEffects() const LLVM_READONLY
Return true if the instruction may have side effects.
LLVM_ABI void dropPoisonGeneratingFlags()
Drops flags that may cause this instruction to evaluate to poison despite having non-poison inputs.
void setDebugLoc(DebugLoc Loc)
Set the debug location information for this instruction.
A wrapper class for inspecting calls to intrinsic functions.
An instruction for reading from memory.
static LLVM_ABI MemoryLocation get(const LoadInst *LI)
Return a location with information about the memory reference by the given instruction.
OptimizationRemarkEmitter legacy analysis pass.
The optimization diagnostic interface.
LLVM_ABI void emit(DiagnosticInfoOptimizationBase &OptDiag)
Output the remark via the diagnostic handler and to the optimization record file.
Diagnostic information for applied optimization remarks.
void addIncoming(Value *V, BasicBlock *BB)
Add an incoming value to the end of the PHI list.
static PHINode * Create(Type *Ty, unsigned NumReservedValues, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Constructors - NumReservedValues is a hint for the number of incoming edges that this phi node will h...
static LLVM_ABI PassRegistry * getPassRegistry()
getPassRegistry - Access the global registry object, which is automatically initialized at applicatio...
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
Analysis pass which computes a PostDominatorTree.
A set of analyses that are preserved following a run of a transformation pass.
Definition Analysis.h:112
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
Definition Analysis.h:118
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.
bool hasProfileSummary() const
Returns true if profile summary is available.
bool isColdBlock(const BBType *BB, BFIT *BFI) const
Returns true if BasicBlock BB is considered cold.
LLVM_ABI bool isColdCallSite(const CallBase &CB, BlockFrequencyInfo *BFI) const
Returns true if call site CB is considered cold.
LLVM_ABI bool isFunctionEntryCold(const Function *F) const
Returns true if F has cold function entry.
Value * getReturnValue() const
Convenience accessor. Returns null if there is no return value.
static SelectInst * Create(Value *C, Value *S1, Value *S2, const Twine &NameStr="", InsertPosition InsertBefore=nullptr, const Instruction *MDFrom=nullptr)
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
iterator begin() const
Definition StringRef.h:114
LLVM_ABI PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM)
Analysis pass providing the TargetTransformInfo.
Wrapper pass for TargetTransformInfo.
This pass provides access to the codegen interfaces that are needed for IR-level transformations.
LLVM_ABI bool isLoweredToCall(const Function *F) const
Test whether calls to a function lower to actual program function calls.
bool isVoidTy() const
Return true if this is 'void'.
Definition Type.h:141
static UncondBrInst * Create(BasicBlock *Target, InsertPosition InsertBefore=nullptr)
void dropAllReferences()
Drop all references to operands.
Definition User.h:324
void setOperand(unsigned i, Value *Val)
Definition User.h:212
Value * getOperand(unsigned i) const
Definition User.h:207
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:255
LLVM_ABI void setName(const Twine &Name)
Change the name of the value.
Definition Value.cpp:394
LLVM_ABI void replaceAllUsesWith(Value *V)
Change all uses of this to point to a new Value.
Definition Value.cpp:553
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Definition Value.cpp:319
LLVM_ABI void takeName(Value *V)
Transfer the name from V to this value.
Definition Value.cpp:400
const ParentTy * getParent() const
Definition ilist_node.h:34
self_iterator getIterator()
Definition ilist_node.h:123
Changed
Abstract Attribute helper functions.
Definition Attributor.h:165
constexpr char Align[]
Key for Kernel::Arg::Metadata::mAlign.
@ Cold
Attempts to make code in the caller as efficient as possible under the assumption that the call is no...
Definition CallingConv.h:47
@ BasicBlock
Various leaf nodes.
Definition ISDOpcodes.h:81
initializer< Ty > init(const Ty &Val)
Add a small namespace to avoid name clashes with the classes used in the streaming interface.
NodeAddr< UseNode * > Use
Definition RDFGraph.h:385
friend class Instruction
Iterator for Instructions in a `BasicBlock.
Definition BasicBlock.h:73
This is an optimization pass for GlobalISel generic memory operations.
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1739
LLVM_ABI FunctionPass * createTailCallEliminationPass()
auto pred_end(const MachineBasicBlock *BB)
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
auto successors(const MachineBasicBlock *BB)
OuterAnalysisManagerProxy< ModuleAnalysisManager, Function > ModuleAnalysisManagerFunctionProxy
Provide the ModuleAnalysisManager to Function proxy.
LLVM_ABI ReturnInst * FoldReturnIntoUncondBranch(ReturnInst *RI, BasicBlock *BB, BasicBlock *Pred, DomTreeUpdater *DTU=nullptr)
This method duplicates the specified return instruction into a predecessor which ends in an unconditi...
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
Definition InstrProf.h:143
LLVM_ABI Value * simplifyInstruction(Instruction *I, const SimplifyQuery &Q)
See if we can compute a simplified version of this instruction.
bool isModSet(const ModRefInfo MRI)
Definition ModRef.h:49
LLVM_ABI bool isSafeToLoadUnconditionally(Value *V, Align Alignment, const APInt &Size, const DataLayout &DL, Instruction *ScanFrom, AssumptionCache *AC=nullptr, const DominatorTree *DT=nullptr, const TargetLibraryInfo *TLI=nullptr)
Return true if we know that executing a load from this value cannot trap.
Definition Loads.cpp:449
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:209
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:547
LLVM_ABI raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
TargetTransformInfo TTI
IRBuilder(LLVMContext &, FolderTy, InserterTy, MDNode *, ArrayRef< OperandBundleDef >) -> IRBuilder< FolderTy, InserterTy >
PredIterator< BasicBlock, Value::user_iterator > pred_iterator
Definition CFG.h:93
auto pred_begin(const MachineBasicBlock *BB)
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Definition STLExtras.h:1947
bool pred_empty(const BasicBlock *BB)
Definition CFG.h:107
AnalysisManager< Function > FunctionAnalysisManager
Convenience typedef for the Function analysis manager.
LLVM_ABI void initializeTailCallElimPass(PassRegistry &)
AAResults AliasAnalysis
Temporary typedef for legacy code that uses a generic AliasAnalysis pointer or reference.
Align valueOrOne() const
For convenience, returns a valid alignment or 1 if undefined.
Definition Alignment.h:130