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 "ScalarOptions.h"
54#include "llvm/ADT/STLExtras.h"
56#include "llvm/ADT/Statistic.h"
62#include "llvm/Analysis/Loads.h"
68#include "llvm/IR/CFG.h"
69#include "llvm/IR/Constants.h"
70#include "llvm/IR/DataLayout.h"
73#include "llvm/IR/Dominators.h"
74#include "llvm/IR/Function.h"
75#include "llvm/IR/IRBuilder.h"
79#include "llvm/IR/MDBuilder.h"
80#include "llvm/IR/Module.h"
83#include "llvm/Pass.h"
85#include "llvm/Support/Debug.h"
89#include <cmath>
90using namespace llvm;
91
92#define DEBUG_TYPE "tailcallelim"
93
94STATISTIC(NumEliminated, "Number of tail calls removed");
95STATISTIC(NumRetDuped, "Number of return duplicated");
96STATISTIC(NumAccumAdded, "Number of accumulators introduced");
97STATISTIC(NumTREPreventedCold,
98 "Number of tail calls/recursion eliminations prevented due to cold "
99 "calling convention or attribute");
100
101static bool shouldDisableTailCallsForCold(const ScalarOptions &Opts,
102 const CallBase *CB,
103 const Function *Caller,
104 const ProfileSummaryInfo *PSI,
105 BlockFrequencyInfo *BFI) {
106 if (!Opts.disable_tail_call_elim_for_cold_calls)
107 return false;
108
109 if (CB && CB->isMustTailCall())
110 return false;
111
112 if (Caller && (Caller->hasFnAttribute(Attribute::Cold) ||
113 Caller->getCallingConv() == CallingConv::Cold))
114 return true;
115
116 if (!PSI || !PSI->hasProfileSummary())
117 return false;
118
119 // We require both the function entry and the call site/block/callee to be
120 // cold.
121 // 1. Checking that the function entry is cold ensures we don't disable tail
122 // call elimination in hot functions (with calls on cold conditional
123 // paths), which would force stack frame setup and teardown on hot paths.
124 // 2. Checking that the call site/block/callee is also cold ensures that if a
125 // function has a cold entry count but contains a hot loop, we don't
126 // disable tail call elimination for calls within that hot loop.
127 if (Caller && PSI->isFunctionEntryCold(Caller) && CB) {
128 if (CB->hasFnAttr(Attribute::Cold) ||
130 return true;
131 if (BFI && (PSI->isColdCallSite(*CB, BFI) ||
132 PSI->isColdBlock(CB->getParent(), BFI)))
133 return true;
134 }
135
136 return false;
137}
138
139/// Scan the specified function for alloca instructions.
140/// If it contains any dynamic allocas, returns false.
141static bool canTRE(Function &F) {
142 // TODO: We don't do TRE if dynamic allocas are used.
143 // Dynamic allocas allocate stack space which should be
144 // deallocated before new iteration started. That is
145 // currently not implemented.
146 return llvm::all_of(instructions(F), [](Instruction &I) {
147 auto *AI = dyn_cast<AllocaInst>(&I);
148 return !AI || AI->isStaticAlloca();
149 });
150}
151
152namespace {
153struct LocalStackValueTracker {
154 // Start at a root value and walk its use-def chain to mark calls that use the
155 // value or a derived value in LocalStackUsers, and places where it may
156 // escape in EscapePoints.
157 void walk(Value *Root) {
158 SmallVector<Use *, 32> Worklist;
159 SmallPtrSet<Use *, 32> Visited;
160
161 auto AddUsesToWorklist = [&](Value *V) {
162 for (auto &U : V->uses()) {
163 if (!Visited.insert(&U).second)
164 continue;
165 Worklist.push_back(&U);
166 }
167 };
168
169 AddUsesToWorklist(Root);
170
171 while (!Worklist.empty()) {
172 Use *U = Worklist.pop_back_val();
173 Instruction *I = cast<Instruction>(U->getUser());
174
175 switch (I->getOpcode()) {
176 case Instruction::Call:
177 case Instruction::Invoke: {
178 auto &CB = cast<CallBase>(*I);
179 // llvm.stackrestore does not capture its argument, but it is not marked
180 // nocapture because of its unusual memory semantics. Treating it as an
181 // escape would block tail calls after every VLA scope.
182 if (auto *II = dyn_cast<IntrinsicInst>(I);
183 II && II->getIntrinsicID() == Intrinsic::stackrestore)
184 continue;
185 // If the alloca-derived argument is passed byval it is not an escape
186 // point, or a use of an alloca. Calling with byval copies the contents
187 // of the alloca into argument registers or stack slots, which exist
188 // beyond the lifetime of the current frame.
189 if (CB.isArgOperand(U) && CB.isByValArgument(CB.getArgOperandNo(U)))
190 continue;
191 bool IsNocapture =
192 CB.isDataOperand(U) && CB.doesNotCapture(CB.getDataOperandNo(U));
193 callUsesLocalStack(CB, IsNocapture);
194 if (IsNocapture) {
195 // If the alloca-derived argument is passed in as nocapture, then it
196 // can't propagate to the call's return. That would be capturing.
197 continue;
198 }
199 break;
200 }
201 case Instruction::Load: {
202 // The result of a load is not alloca-derived (unless an alloca has
203 // otherwise escaped, but this is a local analysis).
204 continue;
205 }
206 case Instruction::Store: {
207 if (U->getOperandNo() == 0)
208 EscapePoints.insert(I);
209 continue; // Stores have no users to analyze.
210 }
211 case Instruction::BitCast:
212 case Instruction::GetElementPtr:
213 case Instruction::PHI:
214 case Instruction::Select:
215 case Instruction::AddrSpaceCast:
216 break;
217 default:
218 EscapePoints.insert(I);
219 break;
220 }
221
222 AddUsesToWorklist(I);
223 }
224 }
225
226 void callUsesLocalStack(CallBase &CB, bool IsNocapture) {
227 // Add it to the list of calls that use the local stack.
228 LocalStackUsers.insert(&CB);
229
230 // If it's nocapture then it can't capture this alloca.
231 if (IsNocapture)
232 return;
233
234 // If it can write to memory, it can leak the alloca value.
235 if (!CB.onlyReadsMemory())
236 EscapePoints.insert(&CB);
237 }
238
239 SmallPtrSet<Instruction *, 32> LocalStackUsers;
240 SmallPtrSet<Instruction *, 32> EscapePoints;
241};
242} // namespace
243
244/// Returns true if \p II returns an address in the current function's frame.
246 if (!II)
247 return false;
248 switch (II->getIntrinsicID()) {
249 case Intrinsic::frameaddress:
250 // A non-zero level refers to a caller's frame, which outlives a tail call.
251 return cast<ConstantInt>(II->getArgOperand(0))->isZero();
252 case Intrinsic::addressofreturnaddress:
253 case Intrinsic::eh_dwarf_cfa:
254 case Intrinsic::localaddress:
255 case Intrinsic::sponentry:
256 case Intrinsic::stackaddress:
257 case Intrinsic::stacksave:
258 case Intrinsic::swift_async_context_addr:
259 return true;
260 default:
261 return false;
262 }
263}
264
265static bool markTails(const ScalarOptions &Opts, Function &F,
267 BlockFrequencyInfo *BFI) {
268 if (F.callsFunctionThatReturnsTwice())
269 return false;
270
271 // The local stack holds allocas and byval arguments, and frame-address
272 // intrinsics point into it.
273 LocalStackValueTracker Tracker;
274 for (Argument &Arg : F.args()) {
275 if (Arg.hasByValAttr())
276 Tracker.walk(&Arg);
277 }
278 for (Instruction &I : instructions(F)) {
279 if (isa<AllocaInst>(&I) ||
281 Tracker.walk(&I);
282 }
283
284 bool Modified = false;
285
286 // Track whether a block is reachable after an alloca has escaped. Blocks that
287 // contain the escaping instruction will be marked as being visited without an
288 // escaped alloca, since that is how the block began.
289 enum VisitType {
290 UNVISITED,
291 UNESCAPED,
292 ESCAPED
293 };
295
296 // We propagate the fact that an alloca has escaped from block to successor.
297 // Visit the blocks that are propagating the escapedness first. To do this, we
298 // maintain two worklists.
299 SmallVector<BasicBlock *, 32> WorklistUnescaped, WorklistEscaped;
300
301 // We may enter a block and visit it thinking that no alloca has escaped yet,
302 // then see an escape point and go back around a loop edge and come back to
303 // the same block twice. Because of this, we defer setting tail on calls when
304 // we first encounter them in a block. Every entry in this list does not
305 // statically use an alloca via use-def chain analysis, but may find an alloca
306 // through other means if the block turns out to be reachable after an escape
307 // point.
308 SmallVector<CallInst *, 32> DeferredTails;
309
310 BasicBlock *BB = &F.getEntryBlock();
311 VisitType Escaped = UNESCAPED;
312 do {
313 for (auto &I : *BB) {
314 if (Tracker.EscapePoints.count(&I))
315 Escaped = ESCAPED;
316
318 // A PseudoProbeInst has the IntrInaccessibleMemOnly tag hence it is
319 // considered accessing memory and will be marked as a tail call if we
320 // don't bail out here.
321 if (!CI || CI->isTailCall() || isa<PseudoProbeInst>(&I))
322 continue;
323
324 // Bail out for intrinsic stackrestore call because it can modify
325 // unescaped allocas.
326 if (auto *II = dyn_cast<IntrinsicInst>(CI))
327 if (II->getIntrinsicID() == Intrinsic::stackrestore)
328 continue;
329
330 // Special-case operand bundles "clang.arc.attachedcall", "ptrauth", and
331 // "kcfi".
332 bool DisableForCold =
333 shouldDisableTailCallsForCold(Opts, CI, &F, PSI, BFI);
334 bool IsNoTail = CI->isNoTailCall() || DisableForCold ||
338 if (!CI->isNoTailCall() && DisableForCold)
339 ++NumTREPreventedCold;
340
341 if (!IsNoTail && CI->doesNotAccessMemory()) {
342 // A call to a readnone function whose arguments are all things computed
343 // outside this function can be marked tail. Even if you stored the
344 // alloca address into a global, a readnone function can't load the
345 // global anyhow.
346 //
347 // Note that this runs whether we know an alloca has escaped or not. If
348 // it has, then we can't trust Tracker.LocalStackUsers to be accurate.
349 bool SafeToTail = true;
350 for (auto &Arg : CI->args()) {
351 if (isa<Constant>(Arg.getUser()))
352 continue;
353 if (Argument *A = dyn_cast<Argument>(Arg.getUser()))
354 if (!A->hasByValAttr())
355 continue;
356 SafeToTail = false;
357 break;
358 }
359 if (SafeToTail) {
360 using namespace ore;
361 ORE->emit([&]() {
362 return OptimizationRemark(DEBUG_TYPE, "tailcall-readnone", CI)
363 << "marked as tail call candidate (readnone)";
364 });
365 CI->setTailCall();
366 Modified = true;
367 continue;
368 }
369 }
370
371 if (!IsNoTail && Escaped == UNESCAPED &&
372 !Tracker.LocalStackUsers.count(CI))
373 DeferredTails.push_back(CI);
374 }
375
376 for (auto *SuccBB : successors(BB)) {
377 auto &State = Visited[SuccBB];
378 if (State < Escaped) {
379 State = Escaped;
380 if (State == ESCAPED)
381 WorklistEscaped.push_back(SuccBB);
382 else
383 WorklistUnescaped.push_back(SuccBB);
384 }
385 }
386
387 if (!WorklistEscaped.empty()) {
388 BB = WorklistEscaped.pop_back_val();
389 Escaped = ESCAPED;
390 } else {
391 BB = nullptr;
392 while (!WorklistUnescaped.empty()) {
393 auto *NextBB = WorklistUnescaped.pop_back_val();
394 if (Visited[NextBB] == UNESCAPED) {
395 BB = NextBB;
396 Escaped = UNESCAPED;
397 break;
398 }
399 }
400 }
401 } while (BB);
402
403 for (CallInst *CI : DeferredTails) {
404 if (Visited[CI->getParent()] != ESCAPED) {
405 // If the escape point was part way through the block, calls after the
406 // escape point wouldn't have been put into DeferredTails.
407 LLVM_DEBUG(dbgs() << "Marked as tail call candidate: " << *CI << "\n");
408 CI->setTailCall();
409 Modified = true;
410 }
411 }
412
413 return Modified;
414}
415
416/// Return true if it is safe to move the specified
417/// instruction from after the call to before the call, assuming that all
418/// instructions between the call and this instruction are movable.
419///
422 if (II->getIntrinsicID() == Intrinsic::lifetime_end)
423 return true;
424
425 // FIXME: We can move load/store/call/free instructions above the call if the
426 // call does not mod/ref the memory location being processed.
427 if (I->mayHaveSideEffects()) // This also handles volatile loads.
428 return false;
429
430 if (LoadInst *L = dyn_cast<LoadInst>(I)) {
431 // Loads may always be moved above calls without side effects.
432 if (CI->mayHaveSideEffects()) {
433 // Non-volatile loads may be moved above a call with side effects if it
434 // does not write to memory and the load provably won't trap.
435 // Writes to memory only matter if they may alias the pointer
436 // being loaded from.
437 const DataLayout &DL = L->getDataLayout();
438 if (isModSet(AA->getModRefInfo(CI, MemoryLocation::get(L))) ||
439 !isSafeToLoadUnconditionally(L->getPointerOperand(), L->getType(),
440 L->getAlign(), SimplifyQuery(DL, L)))
441 return false;
442 }
443 }
444
445 // Otherwise, if this is a side-effect free instruction, check to make sure
446 // that it does not use the return value of the call. If it doesn't use the
447 // return value of the call, it must only use things that are defined before
448 // the call, or movable instructions between the call and the instruction
449 // itself.
450 return !is_contained(I->operands(), CI);
451}
452
453// Return true if I is a unary accumulator recurrence: a chain of
454// applications of a unary function `g` composed with itself,
455// `g(g(...g(Base)...))`, which is equivalent to a single application of the
456// N-times-composed function when `g` is pure. Neither associative nor
457// commutative, this differs from the ordinary accumulator recurrence handled
458// below, which requires I to be associative and commutative.
459//
460// TODO: Generalize this beyond shifts by a constant amount to arbitrary pure
461// unary functions (e.g., `f(x) = x == 0 ? Base : g(f(x - 1))` for any pure
462// unary `g`).
464 if (!I->isShift())
465 return false;
466
467 // A chain of shifts by a constant amount C is equivalent to a single shift
468 // by the sum of the amounts:
469 // ... (Base << C) << C) ... << C == Base << (C * Iterations)
470 // This relation applies to left shifts as well as arithmetic/logical right
471 // shifts when the shift amount is a constant.
472 return isa<ConstantInt>(I->getOperand(1));
473}
474
475namespace {
476class TailRecursionEliminator {
477 const ScalarOptions &Opts;
478 Function &F;
479 const TargetTransformInfo *TTI;
480 AliasAnalysis *AA;
481 OptimizationRemarkEmitter *ORE;
482 DomTreeUpdater &DTU;
483 BlockFrequencyInfo *const BFI;
484 ProfileSummaryInfo *const PSI;
485 const bool UpdateFunctionEntryCount;
486 const uint64_t OrigEntryBBFreq;
487 const uint64_t OrigEntryCount;
488
489 // The below are shared state we want to have available when eliminating any
490 // calls in the function. There values should be populated by
491 // createTailRecurseLoopHeader the first time we find a call we can eliminate.
492 BasicBlock *HeaderBB = nullptr;
493 SmallVector<PHINode *, 8> ArgumentPHIs;
494
495 // PHI node to store our return value.
496 PHINode *RetPN = nullptr;
497
498 // i1 PHI node to track if we have a valid return value stored in RetPN.
499 PHINode *RetKnownPN = nullptr;
500
501 // Vector of select instructions we insereted. These selects use RetKnownPN
502 // to either propagate RetPN or select a new return value.
504
505 // Keep track of the sum of frequencies of blocks that have calls eliminated
506 // so we can synthesize branch weights later that require information on
507 // recursion frequency.
508 uint64_t EliminateBlocksFrequencySum = 0;
509
510 // The below are shared state needed when performing accumulator recursion.
511 // There values should be populated by insertAccumulator the first time we
512 // find an elimination that requires an accumulator.
513
514 // PHI node to store our current accumulated value.
515 PHINode *AccPN = nullptr;
516
517 // The instruction doing the accumulating.
518 Instruction *AccumulatorRecursionInstr = nullptr;
519
520 Constant *AccumulatorInitialValue = nullptr;
521
522 TailRecursionEliminator(const ScalarOptions &Opts, Function &F,
523 const TargetTransformInfo *TTI, AliasAnalysis *AA,
524 OptimizationRemarkEmitter *ORE, DomTreeUpdater &DTU,
525 BlockFrequencyInfo *BFI, ProfileSummaryInfo *PSI,
526 bool UpdateFunctionEntryCount)
527 : Opts(Opts), F(F), TTI(TTI), AA(AA), ORE(ORE), DTU(DTU), BFI(BFI),
528 PSI(PSI), UpdateFunctionEntryCount(UpdateFunctionEntryCount),
529 OrigEntryBBFreq(
530 BFI ? BFI->getBlockFreq(&F.getEntryBlock()).getFrequency() : 0U),
531 OrigEntryCount(F.getEntryCount() ? *F.getEntryCount() : 0) {
532 if (BFI) {
533 // The assert is meant as API documentation for the caller.
534 assert(OrigEntryBBFreq != 0 &&
535 "If a BFI was provided, the function should have an entry "
536 "basic block with a non-zero frequency.");
537 }
538 }
539
540 Constant *findBaseCaseRetConstant(Instruction *AccRecInstr);
541
542 Constant *canTransformAccumulatorRecursion(Instruction *I, CallInst *CI);
543
544 CallInst *findTRECandidate(BasicBlock *BB);
545
546 void createTailRecurseLoopHeader(CallInst *CI);
547
548 void insertAccumulator(Instruction *AccRecInstr);
549
550 bool eliminateCall(CallInst *CI);
551
552 void cleanupAndFinalize();
553
554 bool processBlock(BasicBlock &BB);
555
556 void copyByValueOperandIntoLocalTemp(CallInst *CI, int OpndIdx);
557
558 void copyLocalTempOfByValueOperandIntoArguments(CallInst *CI, int OpndIdx,
559 Instruction *InsertPt);
560
561public:
562 static bool eliminate(Function &F, const TargetTransformInfo *TTI,
563 AliasAnalysis *AA, OptimizationRemarkEmitter *ORE,
564 DomTreeUpdater &DTU, BlockFrequencyInfo *BFI,
565 ProfileSummaryInfo *PSI, bool UpdateFunctionEntryCount);
566};
567} // namespace
568
569// Find the base-case return value for the function, given the accumulator
570// recursion instruction AccRecInstr that is about to be eliminated. Every
571// return other than the one fed by AccRecInstr survives the transformation and
572// will be rewritten to return the accumulator, so all of them have to yield the
573// same base-case constant. Return that constant, or nullptr on failure.
574//
575// RetSelects are the selects already inserted for call sites eliminated via
576// the "found return value" mechanism instead of the accumulator one. Their
577// original `ret` is gone, so they'd otherwise be invisible to the scan below,
578// but they still have to agree on the same base-case constant.
579//
580// FIXME: There is a room for improvement here in the future, e.g., consider
581// non-constant values and multiple base cases -- e.g., we want to be able to
582// handle code like:
583// ```
584// int f(int x) {
585// if (x == 1) return 1;
586// if (x == 10) return 10;
587// return f(x-1) << 1;
588// }
589// ```
590Constant *
591TailRecursionEliminator::findBaseCaseRetConstant(Instruction *AccRecInstr) {
592 Constant *BaseCaseVal = nullptr;
593
594 // Records C as the base-case constant the first time it's seen, and
595 // otherwise checks that it agrees with the one already on record.
596 auto SetOrMatchBaseCase = [&](Constant *C) {
597 if (!BaseCaseVal)
598 BaseCaseVal = C;
599 return BaseCaseVal == C;
600 };
601
602 for (BasicBlock &BB : F) {
603 auto *RI = dyn_cast<ReturnInst>(BB.getTerminator());
604 if (!RI || !RI->getReturnValue())
605 continue;
606
607 Value *RV = RI->getReturnValue();
608
609 // This is the recursive case being turned into a loop: the return goes
610 // away along with AccRecInstr.
611 if (RV == AccRecInstr)
612 continue;
613
614 // Anything else has to be the base case. In particular a return still
615 // computing from a recursive call (e.g. a second recursion site that is
616 // not eliminated) must be rejected: returning the accumulator in its place
617 // would drop that computation.
618 auto *C = dyn_cast<Constant>(RV);
619 if (!C || !SetOrMatchBaseCase(C))
620 return nullptr;
621 }
622
623 for (SelectInst *SI : RetSelects) {
624 auto *C = dyn_cast<Constant>(SI->getFalseValue());
625 if (!C || !SetOrMatchBaseCase(C))
626 return nullptr;
627 }
628
629 return BaseCaseVal;
630}
631
632// This function checks whether the instruction I can be used
633// to perform accumulator recursion elimination for the
634// call instruction CI.
635Constant *
636TailRecursionEliminator::canTransformAccumulatorRecursion(Instruction *I,
637 CallInst *CI) {
638 bool IsUnaryAccumulatorRecurrence = isUnaryAccumulatorRecurrence(I);
639 if ((!I->isAssociative() || !I->isCommutative()) &&
640 !IsUnaryAccumulatorRecurrence)
641 return nullptr;
642
643 assert(I->getNumOperands() >= 2 &&
644 "Associative/commutative operations should have at least 2 args!");
645
646 Constant *AccInitVal = nullptr;
647 if (IsUnaryAccumulatorRecurrence) {
648 // For unary accumulator recurrences, we require that the recursive call
649 // is always on the first operand.
650 if (I->getOperand(0) != CI)
651 return nullptr;
652
653 // findTRECandidate guarantees CI is a recursive call to its own
654 // function, so scan the enclosing function for the base-case return.
655 AccInitVal = findBaseCaseRetConstant(/*AccRecInstr=*/I);
656 if (!AccInitVal)
657 return nullptr;
658 } else {
659 AccInitVal = ConstantExpr::getIdentity(I, I->getType());
660 if (!AccInitVal)
661 return nullptr;
662
663 // Exactly one operand should be the result of the call instruction.
664 if ((I->getOperand(0) == CI && I->getOperand(1) == CI) ||
665 (I->getOperand(0) != CI && I->getOperand(1) != CI))
666 return nullptr;
667 }
668
669 // The only user of this instruction we allow is a single return instruction.
670 if (!I->hasOneUse() || !isa<ReturnInst>(I->user_back()))
671 return nullptr;
672
673 return AccInitVal;
674}
675
676CallInst *TailRecursionEliminator::findTRECandidate(BasicBlock *BB) {
677 Instruction *TI = BB->getTerminator();
678
679 if (&BB->front() == TI) // Make sure there is something before the terminator.
680 return nullptr;
681
682 // Scan backwards from the return, checking to see if there is a tail call in
683 // this block. If so, set CI to it.
684 CallInst *CI = nullptr;
685 BasicBlock::iterator BBI(TI);
686 while (true) {
687 CI = dyn_cast<CallInst>(BBI);
688 if (CI && CI->getCalledFunction() == &F)
689 break;
690
691 if (BBI == BB->begin())
692 return nullptr; // Didn't find a potential tail call.
693 --BBI;
694 }
695
696 assert((!CI->isTailCall() || !CI->isNoTailCall()) &&
697 "Incompatible call site attributes(Tail,NoTail)");
698 if (!CI->isTailCall() ||
699 shouldDisableTailCallsForCold(Opts, CI, &F, PSI, BFI))
700 return nullptr;
701
702 // As a special case, detect code like this:
703 // double fabs(double f) { return __builtin_fabs(f); } // a 'fabs' call
704 // and disable this xform in this case, because the code generator will
705 // lower the call to fabs into inline code.
706 if (BB == &F.getEntryBlock() && &BB->front() == CI &&
707 &*std::next(BB->begin()) == TI && CI->getCalledFunction() &&
709 // A single-block function with just a call and a return. Check that
710 // the arguments match.
711 auto I = CI->arg_begin(), E = CI->arg_end();
712 Function::arg_iterator FI = F.arg_begin(), FE = F.arg_end();
713 for (; I != E && FI != FE; ++I, ++FI)
714 if (*I != &*FI) break;
715 if (I == E && FI == FE)
716 return nullptr;
717 }
718
719 return CI;
720}
721
722void TailRecursionEliminator::createTailRecurseLoopHeader(CallInst *CI) {
723 HeaderBB = &F.getEntryBlock();
724 BasicBlock *NewEntry = BasicBlock::Create(F.getContext(), "", &F, HeaderBB);
725 NewEntry->takeName(HeaderBB);
726 HeaderBB->setName("tailrecurse");
727 auto *BI = UncondBrInst::Create(HeaderBB, NewEntry);
728 BI->setDebugLoc(DebugLoc::getCompilerGenerated());
729 // If the new branch preserves the debug location of CI, it could result in
730 // misleading stepping, if CI is located in a conditional branch.
731 // So, here we don't give any debug location to the new branch.
732
733 // Move all fixed sized allocas from HeaderBB to NewEntry.
734 for (BasicBlock::iterator OEBI = HeaderBB->begin(), E = HeaderBB->end(),
735 NEBI = NewEntry->begin();
736 OEBI != E;)
737 if (AllocaInst *AI = dyn_cast<AllocaInst>(OEBI++))
738 if (isa<ConstantInt>(AI->getArraySize()))
739 AI->moveBefore(NEBI);
740
741 // Now that we have created a new block, which jumps to the entry
742 // block, insert a PHI node for each argument of the function.
743 // For now, we initialize each PHI to only have the real arguments
744 // which are passed in.
745 BasicBlock::iterator InsertPos = HeaderBB->begin();
746 for (Function::arg_iterator I = F.arg_begin(), E = F.arg_end(); I != E; ++I) {
747 PHINode *PN = PHINode::Create(I->getType(), 2, I->getName() + ".tr");
748 PN->insertBefore(InsertPos);
749 I->replaceAllUsesWith(PN); // Everyone use the PHI node now!
750 PN->addIncoming(&*I, NewEntry);
751 ArgumentPHIs.push_back(PN);
752 }
753
754 // If the function doen't return void, create the RetPN and RetKnownPN PHI
755 // nodes to track our return value. We initialize RetPN with poison and
756 // RetKnownPN with false since we can't know our return value at function
757 // entry.
758 Type *RetType = F.getReturnType();
759 if (!RetType->isVoidTy()) {
760 Type *BoolType = Type::getInt1Ty(F.getContext());
761 RetPN = PHINode::Create(RetType, 2, "ret.tr");
762 RetPN->insertBefore(InsertPos);
763 RetKnownPN = PHINode::Create(BoolType, 2, "ret.known.tr");
764 RetKnownPN->insertBefore(InsertPos);
765
766 RetPN->addIncoming(PoisonValue::get(RetType), NewEntry);
767 RetKnownPN->addIncoming(ConstantInt::getFalse(BoolType), NewEntry);
768 }
769
770 // The entry block was changed from HeaderBB to NewEntry.
771 // The forward DominatorTree needs to be recalculated when the EntryBB is
772 // changed. In this corner-case we recalculate the entire tree.
773 DTU.recalculate(*NewEntry->getParent());
774}
775
776void TailRecursionEliminator::insertAccumulator(Instruction *AccRecInstr) {
777 assert(!AccPN && "Trying to insert multiple accumulators");
778
779 AccumulatorRecursionInstr = AccRecInstr;
780
781 // Start by inserting a new PHI node for the accumulator.
782 pred_iterator PB = pred_begin(HeaderBB), PE = pred_end(HeaderBB);
783 AccPN = PHINode::Create(F.getReturnType(), std::distance(PB, PE) + 1,
784 "accumulator.tr");
785 AccPN->insertBefore(HeaderBB->begin());
786
787 // Loop over all of the predecessors of the tail recursion block. For the
788 // real entry into the function we seed the PHI with the identity constant for
789 // the accumulation operation. For any other existing branches to this block
790 // (due to other tail recursions eliminated) the accumulator is not modified.
791 // Because we haven't added the branch in the current block to HeaderBB yet,
792 // it will not show up as a predecessor.
793 for (pred_iterator PI = PB; PI != PE; ++PI) {
794 BasicBlock *P = *PI;
795 if (P == &F.getEntryBlock()) {
796 AccPN->addIncoming(AccumulatorInitialValue, P);
797 } else {
798 AccPN->addIncoming(AccPN, P);
799 }
800 }
801
802 ++NumAccumAdded;
803}
804
805// Creates a copy of contents of ByValue operand of the specified
806// call instruction into the newly created temporarily variable.
807void TailRecursionEliminator::copyByValueOperandIntoLocalTemp(CallInst *CI,
808 int OpndIdx) {
809 Type *AggTy = CI->getParamByValType(OpndIdx);
810 assert(AggTy);
811 const DataLayout &DL = F.getDataLayout();
812
813 // Get alignment of byVal operand.
814 Align Alignment(CI->getParamAlign(OpndIdx).valueOrOne());
815
816 // Create alloca for temporarily byval operands.
817 // Put alloca into the entry block.
818 Value *NewAlloca = new AllocaInst(
819 AggTy, DL.getAllocaAddrSpace(), nullptr, Alignment,
820 CI->getArgOperand(OpndIdx)->getName(), F.getEntryBlock().begin());
821
822 IRBuilder<> Builder(CI);
823 Value *Size = Builder.getInt64(DL.getTypeAllocSize(AggTy));
824
825 // Copy data from byvalue operand into the temporarily variable.
826 Builder.CreateMemCpy(NewAlloca, /*DstAlign*/ Alignment,
827 CI->getArgOperand(OpndIdx),
828 /*SrcAlign*/ Alignment, Size);
829 CI->setArgOperand(OpndIdx, NewAlloca);
830}
831
832// Creates a copy from temporarily variable(keeping value of ByVal argument)
833// into the corresponding function argument location. The copy is inserted
834// before InsertPt, which must come after any instructions that followed the
835// call, since those may still read the current value of the argument.
836void TailRecursionEliminator::copyLocalTempOfByValueOperandIntoArguments(
837 CallInst *CI, int OpndIdx, Instruction *InsertPt) {
838 Type *AggTy = CI->getParamByValType(OpndIdx);
839 assert(AggTy);
840 const DataLayout &DL = F.getDataLayout();
841
842 // Get alignment of byVal operand.
843 Align Alignment(CI->getParamAlign(OpndIdx).valueOrOne());
844
845 IRBuilder<> Builder(InsertPt);
846 Value *Size = Builder.getInt64(DL.getTypeAllocSize(AggTy));
847
848 // Copy data from the temporarily variable into corresponding
849 // function argument location.
850 Builder.CreateMemCpy(F.getArg(OpndIdx), /*DstAlign*/ Alignment,
851 CI->getArgOperand(OpndIdx),
852 /*SrcAlign*/ Alignment, Size);
853}
854
855bool TailRecursionEliminator::eliminateCall(CallInst *CI) {
856 ReturnInst *Ret = cast<ReturnInst>(CI->getParent()->getTerminator());
857
858 // Ok, we found a potential tail call. We can currently only transform the
859 // tail call if all of the instructions between the call and the return are
860 // movable to above the call itself, leaving the call next to the return.
861 // Check that this is the case now.
862 Instruction *AccRecInstr = nullptr;
863 BasicBlock::iterator BBI(CI);
864 for (++BBI; &*BBI != Ret; ++BBI) {
865 if (canMoveAboveCall(&*BBI, CI, AA))
866 continue;
867
868 // If we can't move the instruction above the call, it might be because it
869 // is an (associative and commutative) or unary accumulator recurrence
870 // arithmetic operation that could be transformed using accumulator
871 // recursion elimination. Check to see if this is the case, and if so,
872 // remember which instruction accumulates for later.
873 Constant *AccInitVal = canTransformAccumulatorRecursion(&*BBI, CI);
874
875 if (AccPN || !AccInitVal)
876 return false; // We cannot eliminate the tail recursion!
877
878 // Yes, this is accumulator recursion. Remember which instruction
879 // accumulates.
880 AccRecInstr = &*BBI;
881
882 // Keep track of the base case (i.e., initial value) of the accumulator
883 // return value if any.
884 AccumulatorInitialValue = AccInitVal;
885 }
886
887 BasicBlock *BB = Ret->getParent();
888
889 if (BFI)
890 EliminateBlocksFrequencySum += BFI->getBlockFreq(BB).getFrequency();
891
892 using namespace ore;
893 ORE->emit([&]() {
894 return OptimizationRemark(DEBUG_TYPE, "tailcall-recursion", CI)
895 << "transforming tail recursion into loop";
896 });
897
898 // OK! We can transform this tail call. If this is the first one found,
899 // create the new entry block, allowing us to branch back to the old entry.
900 if (!HeaderBB)
901 createTailRecurseLoopHeader(CI);
902
903 // Copy values of ByVal operands into local temporarily variables.
904 for (unsigned I = 0, E = CI->arg_size(); I != E; ++I) {
905 if (CI->isByValArgument(I))
906 copyByValueOperandIntoLocalTemp(CI, I);
907 }
908
909 // Ok, now that we know we have a pseudo-entry block WITH all of the
910 // required PHI nodes, add entries into the PHI node for the actual
911 // parameters passed into the tail-recursive call.
912 for (unsigned I = 0, E = CI->arg_size(); I != E; ++I) {
913 if (CI->isByValArgument(I)) {
914 copyLocalTempOfByValueOperandIntoArguments(CI, I, Ret);
915 // When eliminating a tail call, we modify the values of the arguments.
916 // Therefore, if the byval parameter has a readonly attribute, we have to
917 // remove it. It is safe because, from the perspective of a caller, the
918 // byval parameter is always treated as "readonly," even if the readonly
919 // attribute is removed.
920 F.removeParamAttr(I, Attribute::ReadOnly);
921 ArgumentPHIs[I]->addIncoming(F.getArg(I), BB);
922 } else
923 ArgumentPHIs[I]->addIncoming(CI->getArgOperand(I), BB);
924 }
925
926 if (AccRecInstr) {
927 insertAccumulator(AccRecInstr);
928
929 // Rewrite the accumulator recursion instruction so that it does not use
930 // the result of the call anymore, instead, use the PHI node we just
931 // inserted.
932 AccRecInstr->setOperand(AccRecInstr->getOperand(0) != CI, AccPN);
933
934 // Reassociating into the loop reorders the operands, so poison-generating
935 // flags (nsw/nuw/exact/...), attributes (range/nonnull/...) and metadata
936 // (!range/...) from the original order may no longer hold.
937 AccRecInstr->dropPoisonGeneratingAnnotations();
938 }
939
940 // Update our return value tracking
941 if (RetPN) {
942 if (Ret->getReturnValue() == CI || AccRecInstr) {
943 // Defer selecting a return value
944 RetPN->addIncoming(RetPN, BB);
945 RetKnownPN->addIncoming(RetKnownPN, BB);
946 } else {
947 // We found a return value we want to use, insert a select instruction to
948 // select it if we don't already know what our return value will be and
949 // store the result in our return value PHI node.
950 SelectInst *SI =
951 SelectInst::Create(RetKnownPN, RetPN, Ret->getReturnValue(),
952 "current.ret.tr", Ret->getIterator());
953 SI->setDebugLoc(Ret->getDebugLoc());
954 RetSelects.push_back(SI);
955
956 RetPN->addIncoming(SI, BB);
957 RetKnownPN->addIncoming(ConstantInt::getTrue(RetKnownPN->getType()), BB);
958 }
959
960 if (AccPN)
961 AccPN->addIncoming(AccRecInstr ? AccRecInstr : AccPN, BB);
962 }
963
964 // Now that all of the PHI nodes are in place, remove the call and
965 // ret instructions, replacing them with an unconditional branch.
966 UncondBrInst *NewBI = UncondBrInst::Create(HeaderBB, Ret->getIterator());
967 NewBI->setDebugLoc(CI->getDebugLoc());
968
969 Ret->eraseFromParent(); // Remove return.
970 CI->eraseFromParent(); // Remove call.
971 DTU.applyUpdates({{DominatorTree::Insert, BB, HeaderBB}});
972 ++NumEliminated;
973 if (!Opts.tre_disable_entrycount_recompute && UpdateFunctionEntryCount &&
974 OrigEntryBBFreq) {
975 assert(F.getEntryCount().has_value());
976 // This pass is not expected to remove BBs, only add an entry BB. For that
977 // reason, and because the BB here isn't the new entry BB, the BFI lookup is
978 // expected to succeed.
979 assert(&F.getEntryBlock() != BB);
980 auto RelativeBBFreq =
981 static_cast<double>(BFI->getBlockFreq(BB).getFrequency()) /
982 static_cast<double>(OrigEntryBBFreq);
983 auto ToSubtract =
984 static_cast<uint64_t>(std::round(RelativeBBFreq * OrigEntryCount));
985 auto OldEntryCount = *F.getEntryCount();
986 if (OldEntryCount <= ToSubtract) {
988 errs() << "[TRE] The entrycount attributable to the recursive call, "
989 << ToSubtract
990 << ", should be strictly lower than the function entry count, "
991 << OldEntryCount << "\n");
992 } else {
993 F.setEntryCount(OldEntryCount - ToSubtract);
994 }
995 }
996 return true;
997}
998
999void TailRecursionEliminator::cleanupAndFinalize() {
1000 // If we eliminated any tail recursions, it's possible that we inserted some
1001 // silly PHI nodes which just merge an initial value (the incoming operand)
1002 // with themselves. Check to see if we did and clean up our mess if so. This
1003 // occurs when a function passes an argument straight through to its tail
1004 // call.
1005 for (PHINode *PN : ArgumentPHIs) {
1006 // If the PHI Node is a dynamic constant, replace it with the value it is.
1007 if (Value *PNV = simplifyInstruction(PN, F.getDataLayout())) {
1008 PN->replaceAllUsesWith(PNV);
1009 PN->eraseFromParent();
1010 }
1011 }
1012
1013 if (RetPN) {
1014 Instruction *AccRecInstr = AccumulatorRecursionInstr;
1015 auto MaterializeAccumulator = [&](Value *OtherVal,
1016 BasicBlock::iterator InsertPt) {
1017 Instruction *New = AccRecInstr->clone();
1018 New->setName("accumulator.ret.tr");
1019 New->setOperand(AccRecInstr->getOperand(0) == AccPN, OtherVal);
1020 New->insertBefore(InsertPt);
1021 New->dropLocation();
1022 return New;
1023 };
1024
1025 if (RetSelects.empty()) {
1026 // If we didn't insert any select instructions, then we know we didn't
1027 // store a return value and we can remove the PHI nodes we inserted.
1028 RetPN->dropAllReferences();
1029 RetPN->eraseFromParent();
1030
1031 RetKnownPN->dropAllReferences();
1032 RetKnownPN->eraseFromParent();
1033
1034 if (AccPN) {
1035 // We need to insert a copy of our accumulator instruction before any
1036 // return in the function, and return its result instead.
1037 for (BasicBlock &BB : F) {
1038 ReturnInst *RI = dyn_cast<ReturnInst>(BB.getTerminator());
1039 if (!RI)
1040 continue;
1041
1042 if (isUnaryAccumulatorRecurrence(AccRecInstr)) {
1043 // Base-case initialization: the accumulator PHI already holds the
1044 // final result, so return it directly.
1045 RI->setOperand(0, AccPN);
1046 } else {
1047 // Since the accumulator starts with the identity value, before the
1048 // return we need to apply the accumulation instruction one more
1049 // time to combine the last value with the result of the recursive
1050 // call.
1051 RI->setOperand(0, MaterializeAccumulator(RI->getOperand(0),
1052 RI->getIterator()));
1053 }
1054 }
1055 }
1056 } else {
1057 // We need to insert a select instruction before any return left in the
1058 // function to select our stored return value if we have one.
1059 for (BasicBlock &BB : F) {
1060 ReturnInst *RI = dyn_cast<ReturnInst>(BB.getTerminator());
1061 if (!RI)
1062 continue;
1063
1064 SelectInst *SI =
1065 SelectInst::Create(RetKnownPN, RetPN, RI->getOperand(0),
1066 "current.ret.tr", RI->getIterator());
1067 SI->setDebugLoc(DebugLoc::getCompilerGenerated());
1068 RetSelects.push_back(SI);
1069 RI->setOperand(0, SI);
1070 }
1071
1072 if (AccPN) {
1073 // We need to insert a copy of our accumulator instruction before any
1074 // of the selects we inserted, and select its result instead.
1075 for (SelectInst *SI : RetSelects) {
1076 if (isUnaryAccumulatorRecurrence(AccRecInstr)) {
1077 SI->setFalseValue(AccPN);
1078 } else {
1079 SI->setFalseValue(
1080 MaterializeAccumulator(SI->getFalseValue(), SI->getIterator()));
1081 }
1082 }
1083 }
1084 }
1085
1086 if (BFI) {
1087 uint64_t BaseCaseBlocksFrequencySum = 0;
1088 for (BasicBlock &BB : F)
1090 BaseCaseBlocksFrequencySum += BFI->getBlockFreq(&BB).getFrequency();
1091
1092 if (EliminateBlocksFrequencySum + BaseCaseBlocksFrequencySum == 0)
1093 return;
1094 SmallVector<uint32_t> Testing = fitWeights({EliminateBlocksFrequencySum, BaseCaseBlocksFrequencySum});
1095 MDBuilder MDB(F.getContext());
1096 MDNode *BranchWeights = MDB.createBranchWeights(
1097 {Testing[0], Testing[1]},
1098 false);
1099 for (SelectInst *SI : RetSelects)
1100 SI->setMetadata(LLVMContext::MD_prof, BranchWeights);
1101 }
1102 }
1103}
1104
1105bool TailRecursionEliminator::processBlock(BasicBlock &BB) {
1106 Instruction *TI = BB.getTerminator();
1107
1108 if (UncondBrInst *BI = dyn_cast<UncondBrInst>(TI)) {
1109 BasicBlock *Succ = BI->getSuccessor();
1110 ReturnInst *Ret = dyn_cast<ReturnInst>(Succ->getFirstNonPHIOrPseudoProbe());
1111
1112 if (!Ret)
1113 return false;
1114
1115 CallInst *CI = findTRECandidate(&BB);
1116
1117 if (!CI)
1118 return false;
1119
1120 LLVM_DEBUG(dbgs() << "FOLDING: " << *Succ
1121 << "INTO UNCOND BRANCH PRED: " << BB);
1122 FoldReturnIntoUncondBranch(Ret, Succ, &BB, &DTU);
1123 ++NumRetDuped;
1124
1125 // If all predecessors of Succ have been eliminated by
1126 // FoldReturnIntoUncondBranch, delete it. It is important to empty it,
1127 // because the ret instruction in there is still using a value which
1128 // eliminateCall will attempt to remove. This block can only contain
1129 // instructions that can't have uses, therefore it is safe to remove.
1130 if (pred_empty(Succ))
1131 DTU.deleteBB(Succ);
1132
1133 eliminateCall(CI);
1134 return true;
1135 }
1136
1137 if (isa<ReturnInst>(TI)) {
1138 CallInst *CI = findTRECandidate(&BB);
1139
1140 if (CI)
1141 return eliminateCall(CI);
1142 }
1143
1144 return false;
1145}
1146
1147bool TailRecursionEliminator::eliminate(
1148 Function &F, const TargetTransformInfo *TTI, AliasAnalysis *AA,
1149 OptimizationRemarkEmitter *ORE, DomTreeUpdater &DTU,
1150 BlockFrequencyInfo *BFI, ProfileSummaryInfo *PSI,
1151 bool UpdateFunctionEntryCount) {
1152 if (F.getFnAttribute("disable-tail-calls").getValueAsBool())
1153 return false;
1154
1155 const ScalarOptions &Opts = getScalarOptions(F);
1156 bool MadeChange = false;
1157 MadeChange |= markTails(Opts, F, ORE, PSI, BFI);
1158
1159 // If this function is a varargs function, we won't be able to PHI the args
1160 // right, so don't even try to convert it...
1161 if (F.getFunctionType()->isVarArg())
1162 return MadeChange;
1163
1164 if (!canTRE(F))
1165 return MadeChange;
1166
1167 // Change any tail recursive calls to loops.
1168 TailRecursionEliminator TRE(Opts, F, TTI, AA, ORE, DTU, BFI, PSI,
1169 UpdateFunctionEntryCount);
1170
1171 for (BasicBlock &BB : F)
1172 MadeChange |= TRE.processBlock(BB);
1173
1174 TRE.cleanupAndFinalize();
1175
1176 return MadeChange;
1177}
1178
1179namespace {
1180struct TailCallElim : public FunctionPass {
1181 static char ID; // Pass identification, replacement for typeid
1182 TailCallElim() : FunctionPass(ID) {
1184 }
1185
1186 void getAnalysisUsage(AnalysisUsage &AU) const override {
1187 AU.addRequired<TargetTransformInfoWrapperPass>();
1188 AU.addRequired<AAResultsWrapperPass>();
1189 AU.addRequired<OptimizationRemarkEmitterWrapperPass>();
1190 AU.addPreserved<GlobalsAAWrapperPass>();
1191 AU.addPreserved<DominatorTreeWrapperPass>();
1192 AU.addPreserved<PostDominatorTreeWrapperPass>();
1193 }
1194
1195 bool runOnFunction(Function &F) override {
1196 if (skipFunction(F))
1197 return false;
1198
1199 auto *DTWP = getAnalysisIfAvailable<DominatorTreeWrapperPass>();
1200 auto *DT = DTWP ? &DTWP->getDomTree() : nullptr;
1201 auto *PDTWP = getAnalysisIfAvailable<PostDominatorTreeWrapperPass>();
1202 auto *PDT = PDTWP ? &PDTWP->getPostDomTree() : nullptr;
1203 // There is no noticable performance difference here between Lazy and Eager
1204 // UpdateStrategy based on some test results. It is feasible to switch the
1205 // UpdateStrategy to Lazy if we find it profitable later.
1206 DomTreeUpdater DTU(DT, PDT, DomTreeUpdater::UpdateStrategy::Eager);
1207
1208 return TailRecursionEliminator::eliminate(
1209 F, &getAnalysis<TargetTransformInfoWrapperPass>().getTTI(F),
1210 &getAnalysis<AAResultsWrapperPass>().getAAResults(),
1211 &getAnalysis<OptimizationRemarkEmitterWrapperPass>().getORE(), DTU,
1212 /*BFI=*/nullptr, /*PSI=*/nullptr, /*UpdateFunctionEntryCount=*/false);
1213 }
1214};
1215} // namespace
1216
1217char TailCallElim::ID = 0;
1218INITIALIZE_PASS_BEGIN(TailCallElim, "tailcallelim", "Tail Call Elimination",
1219 false, false)
1222INITIALIZE_PASS_END(TailCallElim, "tailcallelim", "Tail Call Elimination",
1224
1225// Public interface to the TailCallElimination pass
1227 return new TailCallElim();
1228}
1229
1232
1235 // This must come first. It needs the 2 analyses, meaning, if it came after
1236 // the lines asking for the cached result, should they be nullptr (which, in
1237 // the case of the PDT, is likely), updates to the trees would be missed.
1238 auto *BFI = F.getEntryCount().has_value()
1240 : nullptr;
1241 auto &MAMProxy = AM.getResult<ModuleAnalysisManagerFunctionProxy>(F);
1242 auto *PSI = MAMProxy.getCachedResult<ProfileSummaryAnalysis>(*F.getParent());
1244 auto *DT = AM.getCachedResult<DominatorTreeAnalysis>(F);
1246 // There is no noticable performance difference here between Lazy and Eager
1247 // UpdateStrategy based on some test results. It is feasible to switch the
1248 // UpdateStrategy to Lazy if we find it profitable later.
1249 DomTreeUpdater DTU(DT, PDT, DomTreeUpdater::UpdateStrategy::Eager);
1250 bool Changed = TailRecursionEliminator::eliminate(
1251 F, &TTI, &AA, &ORE, DTU, BFI, PSI, UpdateFunctionEntryCount);
1252
1253 if (!Changed)
1254 return PreservedAnalyses::all();
1258 return PA;
1259}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
uint64_t uint64_t
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(Mod->getContext(), 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 the declarations for profiling metadata utility functions.
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 returnsCurrentFrameAddress(const IntrinsicInst *II)
Returns true if II returns an address in the current function's frame.
static bool isUnaryAccumulatorRecurrence(Instruction *I)
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 bool markTails(const ScalarOptions &Opts, Function &F, OptimizationRemarkEmitter *ORE, ProfileSummaryInfo *PSI, BlockFrequencyInfo *BFI)
static bool shouldDisableTailCallsForCold(const ScalarOptions &Opts, 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.
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:453
iterator begin()
Instruction iterator methods.
Definition BasicBlock.h:440
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
const Instruction & front() const
Definition BasicBlock.h:463
LLVM_ABI InstListType::const_iterator getFirstNonPHIOrPseudoProbe() const
Returns an iterator to the first instruction in this block that is not a PHINode or a pseudo operatio...
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.
uint64_t getFrequency() const
Returns the frequency as a fixpoint number scaled by the entry 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:44
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:312
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 bool mayHaveSideEffects() const LLVM_READONLY
Return true if the instruction may have side effects.
void dropPoisonGeneratingAnnotations()
Drops flags, attributes and metadata that may generate poison.
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
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:257
LLVM_ABI void setName(const Twine &Name)
Change the name of the value.
Definition Value.cpp:390
LLVM_ABI void replaceAllUsesWith(Value *V)
Change all uses of this to point to a new Value.
Definition Value.cpp:549
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Definition Value.cpp:315
LLVM_ABI void takeName(Value *V)
Transfer the name from V to this value.
Definition Value.cpp:396
const ParentTy * getParent() const
Definition ilist_node.h:34
self_iterator getIterator()
Definition ilist_node.h:123
Abstract Attribute helper functions.
Definition Attributor.h:164
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:83
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:1755
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...
const ScalarOptions & getScalarOptions(const LLVMContext &C)
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.
LLVM_ABI SmallVector< uint32_t > fitWeights(ArrayRef< uint64_t > Weights)
Push the weights right to fit in uint32_t.
bool isModSet(const ModRefInfo MRI)
Definition ModRef.h:49
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:209
IRBuilder(LLVMContext &, FolderTy, InserterTy) -> IRBuilder< FolderTy, InserterTy >
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
LLVM_ABI bool isSafeToLoadUnconditionally(Value *V, Align Alignment, const APInt &Size, const SimplifyQuery &SQ, bool IgnoreFree=false)
Return true if we know that executing a load from this value cannot trap.
Definition Loads.cpp:454
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:1963
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:135