forked from OSchip/llvm-project
Become multiple return value aware.
Right now, the pass does not optimize tail recursions involving multiple return values. llvm-svn: 48228
This commit is contained in:
parent
e418de3023
commit
5663fe6613
|
@ -249,6 +249,10 @@ static Value *getCommonReturnValue(ReturnInst *TheRI, CallInst *CI) {
|
||||||
Function *F = TheRI->getParent()->getParent();
|
Function *F = TheRI->getParent()->getParent();
|
||||||
Value *ReturnedValue = 0;
|
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)
|
for (Function::iterator BBI = F->begin(), E = F->end(); BBI != E; ++BBI)
|
||||||
if (ReturnInst *RI = dyn_cast<ReturnInst>(BBI->getTerminator()))
|
if (ReturnInst *RI = dyn_cast<ReturnInst>(BBI->getTerminator()))
|
||||||
if (RI != TheRI) {
|
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
|
// 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
|
// constant, return the value returned by the tail call, or that are being
|
||||||
// accumulator recursion variable eliminated.
|
// accumulator recursion variable eliminated.
|
||||||
if (Ret->getNumOperands() != 0 && Ret->getReturnValue() != CI &&
|
if (Ret->getNumOperands() == 1 && Ret->getReturnValue() != CI &&
|
||||||
!isa<UndefValue>(Ret->getReturnValue()) &&
|
!isa<UndefValue>(Ret->getReturnValue()) &&
|
||||||
AccumulatorRecursionEliminationInitVal == 0 &&
|
AccumulatorRecursionEliminationInitVal == 0 &&
|
||||||
!getCommonReturnValue(Ret, CI))
|
!getCommonReturnValue(Ret, CI))
|
||||||
|
|
Loading…
Reference in New Issue