summaryrefslogtreecommitdiff
path: root/lib/Transforms/Scalar/TailRecursionElimination.cpp
diff options
context:
space:
mode:
authorDevang Patel <dpatel@apple.com>2008-03-11 17:33:32 +0000
committerDevang Patel <dpatel@apple.com>2008-03-11 17:33:32 +0000
commit826c49132a9cba1e08a5fce78d05561d9a3746ce (patch)
treebfc6388064acc2d2224ce93eaa05e4749885c5cd /lib/Transforms/Scalar/TailRecursionElimination.cpp
parent9af014f80c4c45ee815627e8c08eb9a1de6b2a14 (diff)
downloadllvm-826c49132a9cba1e08a5fce78d05561d9a3746ce.tar.gz
llvm-826c49132a9cba1e08a5fce78d05561d9a3746ce.tar.bz2
llvm-826c49132a9cba1e08a5fce78d05561d9a3746ce.tar.xz
Become multiple return value aware.
Right now, the pass does not optimize tail recursions involving multiple return values. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@48228 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/Scalar/TailRecursionElimination.cpp')
-rw-r--r--lib/Transforms/Scalar/TailRecursionElimination.cpp6
1 files changed, 5 insertions, 1 deletions
diff --git a/lib/Transforms/Scalar/TailRecursionElimination.cpp b/lib/Transforms/Scalar/TailRecursionElimination.cpp
index 0623abe5dd..d1320c990d 100644
--- a/lib/Transforms/Scalar/TailRecursionElimination.cpp
+++ b/lib/Transforms/Scalar/TailRecursionElimination.cpp
@@ -249,6 +249,10 @@ static Value *getCommonReturnValue(ReturnInst *TheRI, CallInst *CI) {
Function *F = TheRI->getParent()->getParent();
Value *ReturnedValue = 0;
+ // TODO: Handle multiple value ret instructions;
+ if (isa<StructType>(F->getReturnType()))
+ return 0;
+
for (Function::iterator BBI = F->begin(), E = F->end(); BBI != E; ++BBI)
if (ReturnInst *RI = dyn_cast<ReturnInst>(BBI->getTerminator()))
if (RI != TheRI) {
@@ -363,7 +367,7 @@ bool TailCallElim::ProcessReturningBlock(ReturnInst *Ret, BasicBlock *&OldEntry,
// of the call and return void, ignore the value of the call and return a
// constant, return the value returned by the tail call, or that are being
// accumulator recursion variable eliminated.
- if (Ret->getNumOperands() != 0 && Ret->getReturnValue() != CI &&
+ if (Ret->getNumOperands() == 1 && Ret->getReturnValue() != CI &&
!isa<UndefValue>(Ret->getReturnValue()) &&
AccumulatorRecursionEliminationInitVal == 0 &&
!getCommonReturnValue(Ret, CI))