Enable tail call optimization for functions that return a struct (bug 3664) and for functions that return types that need extending (e.g i1).

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@67934 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Arnold Schwaighofer
2009-03-28 08:33:27 +00:00
parent 1717f3af08
commit e75fd69f15
4 changed files with 37 additions and 12 deletions

View File

@ -2571,3 +2571,27 @@ SDValue TargetLowering::BuildUDIV(SDNode *N, SelectionDAG &DAG,
DAG.getConstant(magics.s-1, getShiftAmountTy()));
}
}
bool TargetLowering::CheckTailCallReturnConstraints(CallSDNode *TheCall, SDValue Ret) {
unsigned NumOps = Ret.getNumOperands();
// Struct return.
if(NumOps >= 5&&
Ret.getOperand(1).getOpcode()==ISD::MERGE_VALUES &&
Ret.getOperand(1).getOperand(0) == SDValue(TheCall, 0))
return true;
if ((NumOps == 1 &&
(Ret.getOperand(0) == SDValue(TheCall,1) ||
Ret.getOperand(0) == SDValue(TheCall,0))) ||
(NumOps == 3 &&
Ret.getOperand(1).getOpcode() == ISD::ANY_EXTEND &&
Ret.getOperand(1).getNumOperands()>0 &&
Ret.getOperand(1).getOperand(0).getOpcode() == ISD::TRUNCATE &&
Ret.getOperand(1).getOperand(0).getNumOperands()>0 &&
Ret.getOperand(1).getOperand(0).getOperand(0) == SDValue(TheCall, 0)) ||
(NumOps > 1 &&
Ret.getOperand(0) == SDValue(TheCall,
TheCall->getNumValues()-1) &&
Ret.getOperand(1) == SDValue(TheCall,0)))
return true;
return false;
}