mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-15 07:39:31 +00:00
Pass callsite return type to TargetLowering::LowerCall and use that to check sibcall eligibility.
llvm-svn: 95130
This commit is contained in:
parent
612cbcdc1a
commit
48375fbf4f
@ -1168,7 +1168,7 @@ public:
|
||||
/// InVals array with legal-type return values from the call, and return
|
||||
/// the resulting token chain value.
|
||||
virtual SDValue
|
||||
LowerCall(SDValue Chain, SDValue Callee,
|
||||
LowerCall(SDValue Chain, SDValue Callee, const Type *RetTy,
|
||||
CallingConv::ID CallConv, bool isVarArg, bool &isTailCall,
|
||||
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
||||
const SmallVectorImpl<ISD::InputArg> &Ins,
|
||||
|
@ -5735,7 +5735,7 @@ TargetLowering::LowerCallTo(SDValue Chain, const Type *RetTy,
|
||||
}
|
||||
|
||||
SmallVector<SDValue, 4> InVals;
|
||||
Chain = LowerCall(Chain, Callee, CallConv, isVarArg, isTailCall,
|
||||
Chain = LowerCall(Chain, Callee, RetTy, CallConv, isVarArg, isTailCall,
|
||||
Outs, Ins, dl, DAG, InVals);
|
||||
|
||||
// Verify that the target's LowerCall behaved as expected.
|
||||
|
@ -895,7 +895,7 @@ void ARMTargetLowering::PassF64ArgInRegs(DebugLoc dl, SelectionDAG &DAG,
|
||||
/// ARMISD:CALL <- callseq_end chain. Also add input and output parameter
|
||||
/// nodes.
|
||||
SDValue
|
||||
ARMTargetLowering::LowerCall(SDValue Chain, SDValue Callee,
|
||||
ARMTargetLowering::LowerCall(SDValue Chain, SDValue Callee, const Type *RetTy,
|
||||
CallingConv::ID CallConv, bool isVarArg,
|
||||
bool &isTailCall,
|
||||
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
||||
|
@ -317,7 +317,7 @@ namespace llvm {
|
||||
SmallVectorImpl<SDValue> &InVals);
|
||||
|
||||
virtual SDValue
|
||||
LowerCall(SDValue Chain, SDValue Callee,
|
||||
LowerCall(SDValue Chain, SDValue Callee, const Type *RetTy,
|
||||
CallingConv::ID CallConv, bool isVarArg,
|
||||
bool &isTailCall,
|
||||
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
||||
|
@ -219,7 +219,7 @@ static SDValue LowerJumpTable(SDValue Op, SelectionDAG &DAG) {
|
||||
#include "AlphaGenCallingConv.inc"
|
||||
|
||||
SDValue
|
||||
AlphaTargetLowering::LowerCall(SDValue Chain, SDValue Callee,
|
||||
AlphaTargetLowering::LowerCall(SDValue Chain, SDValue Callee, const Type *RetTy,
|
||||
CallingConv::ID CallConv, bool isVarArg,
|
||||
bool &isTailCall,
|
||||
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
||||
|
@ -120,7 +120,7 @@ namespace llvm {
|
||||
SmallVectorImpl<SDValue> &InVals);
|
||||
|
||||
virtual SDValue
|
||||
LowerCall(SDValue Chain, SDValue Callee,
|
||||
LowerCall(SDValue Chain, SDValue Callee, const Type *RetTy,
|
||||
CallingConv::ID CallConv, bool isVarArg, bool &isTailCall,
|
||||
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
||||
const SmallVectorImpl<ISD::InputArg> &Ins,
|
||||
|
@ -272,6 +272,7 @@ BlackfinTargetLowering::LowerReturn(SDValue Chain,
|
||||
|
||||
SDValue
|
||||
BlackfinTargetLowering::LowerCall(SDValue Chain, SDValue Callee,
|
||||
const Type *RetTy,
|
||||
CallingConv::ID CallConv, bool isVarArg,
|
||||
bool &isTailCall,
|
||||
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
||||
|
@ -63,7 +63,7 @@ namespace llvm {
|
||||
DebugLoc dl, SelectionDAG &DAG,
|
||||
SmallVectorImpl<SDValue> &InVals);
|
||||
virtual SDValue
|
||||
LowerCall(SDValue Chain, SDValue Callee,
|
||||
LowerCall(SDValue Chain, SDValue Callee, const Type *RetTy,
|
||||
CallingConv::ID CallConv, bool isVarArg, bool &isTailCall,
|
||||
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
||||
const SmallVectorImpl<ISD::InputArg> &Ins,
|
||||
|
@ -1138,7 +1138,7 @@ static SDNode *isLSAAddress(SDValue Op, SelectionDAG &DAG) {
|
||||
}
|
||||
|
||||
SDValue
|
||||
SPUTargetLowering::LowerCall(SDValue Chain, SDValue Callee,
|
||||
SPUTargetLowering::LowerCall(SDValue Chain, SDValue Callee, const Type *RetTy,
|
||||
CallingConv::ID CallConv, bool isVarArg,
|
||||
bool &isTailCall,
|
||||
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
||||
|
@ -156,7 +156,7 @@ namespace llvm {
|
||||
SmallVectorImpl<SDValue> &InVals);
|
||||
|
||||
virtual SDValue
|
||||
LowerCall(SDValue Chain, SDValue Callee,
|
||||
LowerCall(SDValue Chain, SDValue Callee, const Type *RetTy,
|
||||
CallingConv::ID CallConv, bool isVarArg,
|
||||
bool &isTailCall,
|
||||
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
||||
|
@ -271,7 +271,7 @@ MSP430TargetLowering::LowerFormalArguments(SDValue Chain,
|
||||
}
|
||||
|
||||
SDValue
|
||||
MSP430TargetLowering::LowerCall(SDValue Chain, SDValue Callee,
|
||||
MSP430TargetLowering::LowerCall(SDValue Chain, SDValue Callee,const Type *RetTy,
|
||||
CallingConv::ID CallConv, bool isVarArg,
|
||||
bool &isTailCall,
|
||||
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
||||
|
@ -153,7 +153,7 @@ namespace llvm {
|
||||
DebugLoc dl, SelectionDAG &DAG,
|
||||
SmallVectorImpl<SDValue> &InVals);
|
||||
virtual SDValue
|
||||
LowerCall(SDValue Chain, SDValue Callee,
|
||||
LowerCall(SDValue Chain, SDValue Callee, const Type *RetTy,
|
||||
CallingConv::ID CallConv, bool isVarArg, bool &isTailCall,
|
||||
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
||||
const SmallVectorImpl<ISD::InputArg> &Ins,
|
||||
|
@ -684,7 +684,7 @@ static bool CC_MipsO32(unsigned ValNo, EVT ValVT,
|
||||
/// (physical regs)/(stack frame), CALLSEQ_START and CALLSEQ_END are emitted.
|
||||
/// TODO: isVarArg, isTailCall.
|
||||
SDValue
|
||||
MipsTargetLowering::LowerCall(SDValue Chain, SDValue Callee,
|
||||
MipsTargetLowering::LowerCall(SDValue Chain, SDValue Callee, const Type *RetTy,
|
||||
CallingConv::ID CallConv, bool isVarArg,
|
||||
bool &isTailCall,
|
||||
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
||||
|
@ -116,7 +116,7 @@ namespace llvm {
|
||||
SmallVectorImpl<SDValue> &InVals);
|
||||
|
||||
virtual SDValue
|
||||
LowerCall(SDValue Chain, SDValue Callee,
|
||||
LowerCall(SDValue Chain, SDValue Callee, const Type *RetTy,
|
||||
CallingConv::ID CallConv, bool isVarArg,
|
||||
bool &isTailCall,
|
||||
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
||||
|
@ -1353,7 +1353,7 @@ GetDataAddress(DebugLoc dl, SDValue Callee, SDValue &Chain,
|
||||
}
|
||||
|
||||
SDValue
|
||||
PIC16TargetLowering::LowerCall(SDValue Chain, SDValue Callee,
|
||||
PIC16TargetLowering::LowerCall(SDValue Chain, SDValue Callee, const Type *RetTy,
|
||||
CallingConv::ID CallConv, bool isVarArg,
|
||||
bool &isTailCall,
|
||||
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
||||
|
@ -142,7 +142,7 @@ namespace llvm {
|
||||
SmallVectorImpl<SDValue> &InVals);
|
||||
|
||||
virtual SDValue
|
||||
LowerCall(SDValue Chain, SDValue Callee,
|
||||
LowerCall(SDValue Chain, SDValue Callee, const Type *RetTy,
|
||||
CallingConv::ID CallConv, bool isVarArg, bool &isTailCall,
|
||||
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
||||
const SmallVectorImpl<ISD::InputArg> &Ins,
|
||||
|
@ -2674,7 +2674,7 @@ PPCTargetLowering::FinishCall(CallingConv::ID CallConv, DebugLoc dl,
|
||||
}
|
||||
|
||||
SDValue
|
||||
PPCTargetLowering::LowerCall(SDValue Chain, SDValue Callee,
|
||||
PPCTargetLowering::LowerCall(SDValue Chain, SDValue Callee, const Type *RetTy,
|
||||
CallingConv::ID CallConv, bool isVarArg,
|
||||
bool &isTailCall,
|
||||
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
||||
|
@ -430,7 +430,7 @@ namespace llvm {
|
||||
SmallVectorImpl<SDValue> &InVals);
|
||||
|
||||
virtual SDValue
|
||||
LowerCall(SDValue Chain, SDValue Callee,
|
||||
LowerCall(SDValue Chain, SDValue Callee, const Type *RetTy,
|
||||
CallingConv::ID CallConv, bool isVarArg, bool &isTailCall,
|
||||
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
||||
const SmallVectorImpl<ISD::InputArg> &Ins,
|
||||
|
@ -250,7 +250,7 @@ SparcTargetLowering::LowerFormalArguments(SDValue Chain,
|
||||
}
|
||||
|
||||
SDValue
|
||||
SparcTargetLowering::LowerCall(SDValue Chain, SDValue Callee,
|
||||
SparcTargetLowering::LowerCall(SDValue Chain, SDValue Callee, const Type *RetTy,
|
||||
CallingConv::ID CallConv, bool isVarArg,
|
||||
bool &isTailCall,
|
||||
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
||||
|
@ -85,7 +85,7 @@ namespace llvm {
|
||||
SmallVectorImpl<SDValue> &InVals);
|
||||
|
||||
virtual SDValue
|
||||
LowerCall(SDValue Chain, SDValue Callee,
|
||||
LowerCall(SDValue Chain, SDValue Callee, const Type *RetTy,
|
||||
CallingConv::ID CallConv, bool isVarArg,
|
||||
bool &isTailCall,
|
||||
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
||||
|
@ -249,6 +249,7 @@ SystemZTargetLowering::LowerFormalArguments(SDValue Chain,
|
||||
|
||||
SDValue
|
||||
SystemZTargetLowering::LowerCall(SDValue Chain, SDValue Callee,
|
||||
const Type *RetTy,
|
||||
CallingConv::ID CallConv, bool isVarArg,
|
||||
bool &isTailCall,
|
||||
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
||||
|
@ -124,7 +124,7 @@ namespace llvm {
|
||||
DebugLoc dl, SelectionDAG &DAG,
|
||||
SmallVectorImpl<SDValue> &InVals);
|
||||
virtual SDValue
|
||||
LowerCall(SDValue Chain, SDValue Callee,
|
||||
LowerCall(SDValue Chain, SDValue Callee, const Type *RetTy,
|
||||
CallingConv::ID CallConv, bool isVarArg, bool &isTailCall,
|
||||
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
||||
const SmallVectorImpl<ISD::InputArg> &Ins,
|
||||
|
@ -1778,7 +1778,7 @@ EmitTailCallStoreRetAddr(SelectionDAG & DAG, MachineFunction &MF,
|
||||
}
|
||||
|
||||
SDValue
|
||||
X86TargetLowering::LowerCall(SDValue Chain, SDValue Callee,
|
||||
X86TargetLowering::LowerCall(SDValue Chain, SDValue Callee, const Type *RetTy,
|
||||
CallingConv::ID CallConv, bool isVarArg,
|
||||
bool &isTailCall,
|
||||
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
||||
@ -1791,8 +1791,8 @@ X86TargetLowering::LowerCall(SDValue Chain, SDValue Callee,
|
||||
|
||||
if (isTailCall)
|
||||
// Check if it's really possible to do a tail call.
|
||||
isTailCall = IsEligibleForTailCallOptimization(Callee, CallConv, isVarArg,
|
||||
Outs, Ins, DAG);
|
||||
isTailCall = IsEligibleForTailCallOptimization(Callee, RetTy, CallConv,
|
||||
isVarArg, Outs, Ins, DAG);
|
||||
|
||||
assert(!(isVarArg && CallConv == CallingConv::Fast) &&
|
||||
"Var args not supported with calling convention fastcc");
|
||||
@ -2247,6 +2247,7 @@ unsigned X86TargetLowering::GetAlignedArgumentStackSize(unsigned StackSize,
|
||||
/// optimization should implement this function.
|
||||
bool
|
||||
X86TargetLowering::IsEligibleForTailCallOptimization(SDValue Callee,
|
||||
const Type *RetTy,
|
||||
CallingConv::ID CalleeCC,
|
||||
bool isVarArg,
|
||||
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
||||
@ -2328,14 +2329,7 @@ X86TargetLowering::IsEligibleForTailCallOptimization(SDValue Callee,
|
||||
return true;
|
||||
|
||||
// If the return types match, then it's safe.
|
||||
// Don't tail call optimize recursive call.
|
||||
GlobalAddressSDNode *G = dyn_cast<GlobalAddressSDNode>(Callee);
|
||||
if (!G) return false; // FIXME: common external symbols?
|
||||
if (const Function *CalleeF = dyn_cast<Function>(G->getGlobal())) {
|
||||
const Type *CalleeRetTy = CalleeF->getReturnType();
|
||||
return CallerRetTy == CalleeRetTy;
|
||||
}
|
||||
return false;
|
||||
return CallerRetTy == RetTy;
|
||||
}
|
||||
|
||||
FastISel *
|
||||
|
@ -627,7 +627,7 @@ namespace llvm {
|
||||
/// IsEligibleForTailCallOptimization - Check whether the call is eligible
|
||||
/// for tail call optimization. Targets which want to do tail call
|
||||
/// optimization should implement this function.
|
||||
bool IsEligibleForTailCallOptimization(SDValue Callee,
|
||||
bool IsEligibleForTailCallOptimization(SDValue Callee, const Type *RetTy,
|
||||
CallingConv::ID CalleeCC,
|
||||
bool isVarArg,
|
||||
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
||||
@ -707,7 +707,7 @@ namespace llvm {
|
||||
DebugLoc dl, SelectionDAG &DAG,
|
||||
SmallVectorImpl<SDValue> &InVals);
|
||||
virtual SDValue
|
||||
LowerCall(SDValue Chain, SDValue Callee,
|
||||
LowerCall(SDValue Chain, SDValue Callee, const Type *RetTy,
|
||||
CallingConv::ID CallConv, bool isVarArg, bool &isTailCall,
|
||||
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
||||
const SmallVectorImpl<ISD::InputArg> &Ins,
|
||||
|
@ -609,7 +609,7 @@ SDValue XCoreTargetLowering::LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) {
|
||||
|
||||
/// XCore call implementation
|
||||
SDValue
|
||||
XCoreTargetLowering::LowerCall(SDValue Chain, SDValue Callee,
|
||||
XCoreTargetLowering::LowerCall(SDValue Chain, SDValue Callee, const Type *RetTy,
|
||||
CallingConv::ID CallConv, bool isVarArg,
|
||||
bool &isTailCall,
|
||||
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
||||
|
@ -147,7 +147,7 @@ namespace llvm {
|
||||
SmallVectorImpl<SDValue> &InVals);
|
||||
|
||||
virtual SDValue
|
||||
LowerCall(SDValue Chain, SDValue Callee,
|
||||
LowerCall(SDValue Chain, SDValue Callee, const Type *RetTy,
|
||||
CallingConv::ID CallConv, bool isVarArg,
|
||||
bool &isTailCall,
|
||||
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
||||
|
Loading…
Reference in New Issue
Block a user