1 //===- TailRecursionElimination.cpp - Eliminate Tail Calls ----------------===//
3 // The LLVM Compiler Infrastructure
5 // This file was developed by the LLVM research group and is distributed under
6 // the University of Illinois Open Source License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file implements tail recursion elimination.
12 // Caveats: The algorithm implemented is trivially simple. There are several
13 // improvements that could be made:
15 // 1. If the function has any alloca instructions, these instructions will not
16 // remain in the entry block of the function. Doing this requires analysis
17 // to prove that the alloca is not reachable by the recursively invoked
19 // 2. Tail recursion is only performed if the call immediately preceeds the
20 // return instruction. Would it be useful to generalize this somehow?
21 // 3. TRE is only performed if the function returns void or if the return
22 // returns the result returned by the call. It is possible, but unlikely,
23 // that the return returns something else (like constant 0), and can still
24 // be TRE'd. It can be TRE'd if ALL OTHER return instructions in the
25 // function return the exact same value.
27 //===----------------------------------------------------------------------===//
29 #include "llvm/Transforms/Scalar.h"
30 #include "llvm/DerivedTypes.h"
31 #include "llvm/Function.h"
32 #include "llvm/Instructions.h"
33 #include "llvm/Pass.h"
34 #include "Support/Statistic.h"
39 Statistic<> NumEliminated("tailcallelim", "Number of tail calls removed");
41 struct TailCallElim : public FunctionPass {
42 virtual bool runOnFunction(Function &F);
44 RegisterOpt<TailCallElim> X("tailcallelim", "Tail Call Elimination");
47 // Public interface to the TailCallElimination pass
48 FunctionPass *llvm::createTailCallEliminationPass() {
49 return new TailCallElim();
53 bool TailCallElim::runOnFunction(Function &F) {
54 // If this function is a varargs function, we won't be able to PHI the args
55 // right, so don't even try to convert it...
56 if (F.getFunctionType()->isVarArg()) return false;
58 BasicBlock *OldEntry = 0;
59 std::vector<PHINode*> ArgumentPHIs;
60 bool MadeChange = false;
62 // Loop over the function, looking for any returning blocks...
63 for (Function::iterator BB = F.begin(), E = F.end(); BB != E; ++BB)
64 if (ReturnInst *Ret = dyn_cast<ReturnInst>(BB->getTerminator()))
65 if (Ret != BB->begin()) // Make sure there is something before the ret...
66 if (CallInst *CI = dyn_cast<CallInst>(Ret->getPrev()))
67 // Make sure the tail call is to the current function, and that the
68 // return either returns void or returns the value computed by the
70 if (CI->getCalledFunction() == &F &&
71 (Ret->getNumOperands() == 0 || Ret->getReturnValue() == CI)) {
72 // Ohh, it looks like we found a tail call, is this the first?
74 // Ok, so this is the first tail call we have found in this
75 // function. Insert a new entry block into the function, allowing
76 // us to branch back to the old entry block.
77 OldEntry = &F.getEntryBlock();
78 BasicBlock *NewEntry = new BasicBlock("tailrecurse", OldEntry);
79 new BranchInst(OldEntry, NewEntry);
81 // Now that we have created a new block, which jumps to the entry
82 // block, insert a PHI node for each argument of the function.
83 // For now, we initialize each PHI to only have the real arguments
84 // which are passed in.
85 Instruction *InsertPos = OldEntry->begin();
86 for (Function::aiterator I = F.abegin(), E = F.aend(); I!=E; ++I){
87 PHINode *PN = new PHINode(I->getType(), I->getName()+".tr",
89 I->replaceAllUsesWith(PN); // Everyone use the PHI node now!
90 PN->addIncoming(I, NewEntry);
91 ArgumentPHIs.push_back(PN);
95 // Ok, now that we know we have a pseudo-entry block WITH all of the
96 // required PHI nodes, add entries into the PHI node for the actual
97 // parameters passed into the tail-recursive call.
98 for (unsigned i = 0, e = CI->getNumOperands()-1; i != e; ++i)
99 ArgumentPHIs[i]->addIncoming(CI->getOperand(i+1), BB);
101 // Now that all of the PHI nodes are in place, remove the call and
102 // ret instructions, replacing them with an unconditional branch.
103 new BranchInst(OldEntry, CI);
104 BB->getInstList().pop_back(); // Remove return.
105 BB->getInstList().pop_back(); // Remove call.