mirror of
https://github.com/RPCSX/llvm.git
synced 2025-05-13 10:56:01 +00:00
Eliminate target hook IsEligibleForTailCallOptimization.
Target independent isel should always pass along the "tail call" property. Change target hook LowerCall's parameter "isTailCall" into a refernce. If the target decides it's impossible to honor the tail call request, it should set isTailCall to false to make target independent isel happy. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@94626 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
381993f1f2
commit
0c439eb2c8
@ -1167,15 +1167,9 @@ public:
|
|||||||
/// described by the Ins array. The implementation should fill in the
|
/// described by the Ins array. The implementation should fill in the
|
||||||
/// InVals array with legal-type return values from the call, and return
|
/// InVals array with legal-type return values from the call, and return
|
||||||
/// the resulting token chain value.
|
/// the resulting token chain value.
|
||||||
///
|
|
||||||
/// The isTailCall flag here is normative. If it is true, the
|
|
||||||
/// implementation must emit a tail call. The
|
|
||||||
/// IsEligibleForTailCallOptimization hook should be used to catch
|
|
||||||
/// cases that cannot be handled.
|
|
||||||
///
|
|
||||||
virtual SDValue
|
virtual SDValue
|
||||||
LowerCall(SDValue Chain, SDValue Callee,
|
LowerCall(SDValue Chain, SDValue Callee,
|
||||||
CallingConv::ID CallConv, bool isVarArg, bool isTailCall,
|
CallingConv::ID CallConv, bool isVarArg, bool &isTailCall,
|
||||||
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
||||||
const SmallVectorImpl<ISD::InputArg> &Ins,
|
const SmallVectorImpl<ISD::InputArg> &Ins,
|
||||||
DebugLoc dl, SelectionDAG &DAG,
|
DebugLoc dl, SelectionDAG &DAG,
|
||||||
|
@ -4651,9 +4651,6 @@ SelectionDAGBuilder::visitIntrinsicCall(CallInst &I, unsigned Intrinsic) {
|
|||||||
/// between it and the return.
|
/// between it and the return.
|
||||||
///
|
///
|
||||||
/// This function only tests target-independent requirements.
|
/// This function only tests target-independent requirements.
|
||||||
/// For target-dependent requirements, a target should override
|
|
||||||
/// TargetLowering::IsEligibleForTailCallOptimization.
|
|
||||||
///
|
|
||||||
static bool
|
static bool
|
||||||
isInTailCallPosition(const Instruction *I, Attributes CalleeRetAttr,
|
isInTailCallPosition(const Instruction *I, Attributes CalleeRetAttr,
|
||||||
const TargetLowering &TLI) {
|
const TargetLowering &TLI) {
|
||||||
@ -6204,12 +6201,6 @@ TargetLowering::LowerCallTo(SDValue Chain, const Type *RetTy,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if target-dependent constraints permit a tail call here.
|
|
||||||
// Target-independent constraints should be checked by the caller.
|
|
||||||
if (isTailCall &&
|
|
||||||
!IsEligibleForTailCallOptimization(Callee, CallConv, isVarArg, Ins, DAG))
|
|
||||||
isTailCall = false;
|
|
||||||
|
|
||||||
SmallVector<SDValue, 4> InVals;
|
SmallVector<SDValue, 4> InVals;
|
||||||
Chain = LowerCall(Chain, Callee, CallConv, isVarArg, isTailCall,
|
Chain = LowerCall(Chain, Callee, CallConv, isVarArg, isTailCall,
|
||||||
Outs, Ins, dl, DAG, InVals);
|
Outs, Ins, dl, DAG, InVals);
|
||||||
|
@ -897,11 +897,13 @@ void ARMTargetLowering::PassF64ArgInRegs(DebugLoc dl, SelectionDAG &DAG,
|
|||||||
SDValue
|
SDValue
|
||||||
ARMTargetLowering::LowerCall(SDValue Chain, SDValue Callee,
|
ARMTargetLowering::LowerCall(SDValue Chain, SDValue Callee,
|
||||||
CallingConv::ID CallConv, bool isVarArg,
|
CallingConv::ID CallConv, bool isVarArg,
|
||||||
bool isTailCall,
|
bool &isTailCall,
|
||||||
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
||||||
const SmallVectorImpl<ISD::InputArg> &Ins,
|
const SmallVectorImpl<ISD::InputArg> &Ins,
|
||||||
DebugLoc dl, SelectionDAG &DAG,
|
DebugLoc dl, SelectionDAG &DAG,
|
||||||
SmallVectorImpl<SDValue> &InVals) {
|
SmallVectorImpl<SDValue> &InVals) {
|
||||||
|
// ARM target does not yet support tail call optimization.
|
||||||
|
isTailCall = false;
|
||||||
|
|
||||||
// Analyze operands of the call, assigning locations to each operand.
|
// Analyze operands of the call, assigning locations to each operand.
|
||||||
SmallVector<CCValAssign, 16> ArgLocs;
|
SmallVector<CCValAssign, 16> ArgLocs;
|
||||||
|
@ -319,7 +319,7 @@ namespace llvm {
|
|||||||
virtual SDValue
|
virtual SDValue
|
||||||
LowerCall(SDValue Chain, SDValue Callee,
|
LowerCall(SDValue Chain, SDValue Callee,
|
||||||
CallingConv::ID CallConv, bool isVarArg,
|
CallingConv::ID CallConv, bool isVarArg,
|
||||||
bool isTailCall,
|
bool &isTailCall,
|
||||||
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
||||||
const SmallVectorImpl<ISD::InputArg> &Ins,
|
const SmallVectorImpl<ISD::InputArg> &Ins,
|
||||||
DebugLoc dl, SelectionDAG &DAG,
|
DebugLoc dl, SelectionDAG &DAG,
|
||||||
|
@ -221,11 +221,13 @@ static SDValue LowerJumpTable(SDValue Op, SelectionDAG &DAG) {
|
|||||||
SDValue
|
SDValue
|
||||||
AlphaTargetLowering::LowerCall(SDValue Chain, SDValue Callee,
|
AlphaTargetLowering::LowerCall(SDValue Chain, SDValue Callee,
|
||||||
CallingConv::ID CallConv, bool isVarArg,
|
CallingConv::ID CallConv, bool isVarArg,
|
||||||
bool isTailCall,
|
bool &isTailCall,
|
||||||
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
||||||
const SmallVectorImpl<ISD::InputArg> &Ins,
|
const SmallVectorImpl<ISD::InputArg> &Ins,
|
||||||
DebugLoc dl, SelectionDAG &DAG,
|
DebugLoc dl, SelectionDAG &DAG,
|
||||||
SmallVectorImpl<SDValue> &InVals) {
|
SmallVectorImpl<SDValue> &InVals) {
|
||||||
|
// Alpha target does not yet support tail call optimization.
|
||||||
|
isTailCall = false;
|
||||||
|
|
||||||
// Analyze operands of the call, assigning locations to each operand.
|
// Analyze operands of the call, assigning locations to each operand.
|
||||||
SmallVector<CCValAssign, 16> ArgLocs;
|
SmallVector<CCValAssign, 16> ArgLocs;
|
||||||
|
@ -121,7 +121,7 @@ namespace llvm {
|
|||||||
|
|
||||||
virtual SDValue
|
virtual SDValue
|
||||||
LowerCall(SDValue Chain, SDValue Callee,
|
LowerCall(SDValue Chain, SDValue Callee,
|
||||||
CallingConv::ID CallConv, bool isVarArg, bool isTailCall,
|
CallingConv::ID CallConv, bool isVarArg, bool &isTailCall,
|
||||||
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
||||||
const SmallVectorImpl<ISD::InputArg> &Ins,
|
const SmallVectorImpl<ISD::InputArg> &Ins,
|
||||||
DebugLoc dl, SelectionDAG &DAG,
|
DebugLoc dl, SelectionDAG &DAG,
|
||||||
|
@ -273,11 +273,13 @@ BlackfinTargetLowering::LowerReturn(SDValue Chain,
|
|||||||
SDValue
|
SDValue
|
||||||
BlackfinTargetLowering::LowerCall(SDValue Chain, SDValue Callee,
|
BlackfinTargetLowering::LowerCall(SDValue Chain, SDValue Callee,
|
||||||
CallingConv::ID CallConv, bool isVarArg,
|
CallingConv::ID CallConv, bool isVarArg,
|
||||||
bool isTailCall,
|
bool &isTailCall,
|
||||||
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
||||||
const SmallVectorImpl<ISD::InputArg> &Ins,
|
const SmallVectorImpl<ISD::InputArg> &Ins,
|
||||||
DebugLoc dl, SelectionDAG &DAG,
|
DebugLoc dl, SelectionDAG &DAG,
|
||||||
SmallVectorImpl<SDValue> &InVals) {
|
SmallVectorImpl<SDValue> &InVals) {
|
||||||
|
// Blackfin target does not yet support tail call optimization.
|
||||||
|
isTailCall = false;
|
||||||
|
|
||||||
// Analyze operands of the call, assigning locations to each operand.
|
// Analyze operands of the call, assigning locations to each operand.
|
||||||
SmallVector<CCValAssign, 16> ArgLocs;
|
SmallVector<CCValAssign, 16> ArgLocs;
|
||||||
|
@ -64,7 +64,7 @@ namespace llvm {
|
|||||||
SmallVectorImpl<SDValue> &InVals);
|
SmallVectorImpl<SDValue> &InVals);
|
||||||
virtual SDValue
|
virtual SDValue
|
||||||
LowerCall(SDValue Chain, SDValue Callee,
|
LowerCall(SDValue Chain, SDValue Callee,
|
||||||
CallingConv::ID CallConv, bool isVarArg, bool isTailCall,
|
CallingConv::ID CallConv, bool isVarArg, bool &isTailCall,
|
||||||
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
||||||
const SmallVectorImpl<ISD::InputArg> &Ins,
|
const SmallVectorImpl<ISD::InputArg> &Ins,
|
||||||
DebugLoc dl, SelectionDAG &DAG,
|
DebugLoc dl, SelectionDAG &DAG,
|
||||||
|
@ -1140,11 +1140,13 @@ static SDNode *isLSAAddress(SDValue Op, SelectionDAG &DAG) {
|
|||||||
SDValue
|
SDValue
|
||||||
SPUTargetLowering::LowerCall(SDValue Chain, SDValue Callee,
|
SPUTargetLowering::LowerCall(SDValue Chain, SDValue Callee,
|
||||||
CallingConv::ID CallConv, bool isVarArg,
|
CallingConv::ID CallConv, bool isVarArg,
|
||||||
bool isTailCall,
|
bool &isTailCall,
|
||||||
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
||||||
const SmallVectorImpl<ISD::InputArg> &Ins,
|
const SmallVectorImpl<ISD::InputArg> &Ins,
|
||||||
DebugLoc dl, SelectionDAG &DAG,
|
DebugLoc dl, SelectionDAG &DAG,
|
||||||
SmallVectorImpl<SDValue> &InVals) {
|
SmallVectorImpl<SDValue> &InVals) {
|
||||||
|
// CellSPU target does not yet support tail call optimization.
|
||||||
|
isTailCall = false;
|
||||||
|
|
||||||
const SPUSubtarget *ST = SPUTM.getSubtargetImpl();
|
const SPUSubtarget *ST = SPUTM.getSubtargetImpl();
|
||||||
unsigned NumOps = Outs.size();
|
unsigned NumOps = Outs.size();
|
||||||
|
@ -158,7 +158,7 @@ namespace llvm {
|
|||||||
virtual SDValue
|
virtual SDValue
|
||||||
LowerCall(SDValue Chain, SDValue Callee,
|
LowerCall(SDValue Chain, SDValue Callee,
|
||||||
CallingConv::ID CallConv, bool isVarArg,
|
CallingConv::ID CallConv, bool isVarArg,
|
||||||
bool isTailCall,
|
bool &isTailCall,
|
||||||
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
||||||
const SmallVectorImpl<ISD::InputArg> &Ins,
|
const SmallVectorImpl<ISD::InputArg> &Ins,
|
||||||
DebugLoc dl, SelectionDAG &DAG,
|
DebugLoc dl, SelectionDAG &DAG,
|
||||||
|
@ -273,11 +273,13 @@ MSP430TargetLowering::LowerFormalArguments(SDValue Chain,
|
|||||||
SDValue
|
SDValue
|
||||||
MSP430TargetLowering::LowerCall(SDValue Chain, SDValue Callee,
|
MSP430TargetLowering::LowerCall(SDValue Chain, SDValue Callee,
|
||||||
CallingConv::ID CallConv, bool isVarArg,
|
CallingConv::ID CallConv, bool isVarArg,
|
||||||
bool isTailCall,
|
bool &isTailCall,
|
||||||
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
||||||
const SmallVectorImpl<ISD::InputArg> &Ins,
|
const SmallVectorImpl<ISD::InputArg> &Ins,
|
||||||
DebugLoc dl, SelectionDAG &DAG,
|
DebugLoc dl, SelectionDAG &DAG,
|
||||||
SmallVectorImpl<SDValue> &InVals) {
|
SmallVectorImpl<SDValue> &InVals) {
|
||||||
|
// MSP430 target does not yet support tail call optimization.
|
||||||
|
isTailCall = false;
|
||||||
|
|
||||||
switch (CallConv) {
|
switch (CallConv) {
|
||||||
default:
|
default:
|
||||||
|
@ -154,7 +154,7 @@ namespace llvm {
|
|||||||
SmallVectorImpl<SDValue> &InVals);
|
SmallVectorImpl<SDValue> &InVals);
|
||||||
virtual SDValue
|
virtual SDValue
|
||||||
LowerCall(SDValue Chain, SDValue Callee,
|
LowerCall(SDValue Chain, SDValue Callee,
|
||||||
CallingConv::ID CallConv, bool isVarArg, bool isTailCall,
|
CallingConv::ID CallConv, bool isVarArg, bool &isTailCall,
|
||||||
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
||||||
const SmallVectorImpl<ISD::InputArg> &Ins,
|
const SmallVectorImpl<ISD::InputArg> &Ins,
|
||||||
DebugLoc dl, SelectionDAG &DAG,
|
DebugLoc dl, SelectionDAG &DAG,
|
||||||
|
@ -686,11 +686,13 @@ static bool CC_MipsO32(unsigned ValNo, EVT ValVT,
|
|||||||
SDValue
|
SDValue
|
||||||
MipsTargetLowering::LowerCall(SDValue Chain, SDValue Callee,
|
MipsTargetLowering::LowerCall(SDValue Chain, SDValue Callee,
|
||||||
CallingConv::ID CallConv, bool isVarArg,
|
CallingConv::ID CallConv, bool isVarArg,
|
||||||
bool isTailCall,
|
bool &isTailCall,
|
||||||
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
||||||
const SmallVectorImpl<ISD::InputArg> &Ins,
|
const SmallVectorImpl<ISD::InputArg> &Ins,
|
||||||
DebugLoc dl, SelectionDAG &DAG,
|
DebugLoc dl, SelectionDAG &DAG,
|
||||||
SmallVectorImpl<SDValue> &InVals) {
|
SmallVectorImpl<SDValue> &InVals) {
|
||||||
|
// MIPs target does not yet support tail call optimization.
|
||||||
|
isTailCall = false;
|
||||||
|
|
||||||
MachineFunction &MF = DAG.getMachineFunction();
|
MachineFunction &MF = DAG.getMachineFunction();
|
||||||
MachineFrameInfo *MFI = MF.getFrameInfo();
|
MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||||
|
@ -118,7 +118,7 @@ namespace llvm {
|
|||||||
virtual SDValue
|
virtual SDValue
|
||||||
LowerCall(SDValue Chain, SDValue Callee,
|
LowerCall(SDValue Chain, SDValue Callee,
|
||||||
CallingConv::ID CallConv, bool isVarArg,
|
CallingConv::ID CallConv, bool isVarArg,
|
||||||
bool isTailCall,
|
bool &isTailCall,
|
||||||
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
||||||
const SmallVectorImpl<ISD::InputArg> &Ins,
|
const SmallVectorImpl<ISD::InputArg> &Ins,
|
||||||
DebugLoc dl, SelectionDAG &DAG,
|
DebugLoc dl, SelectionDAG &DAG,
|
||||||
|
@ -1355,11 +1355,13 @@ GetDataAddress(DebugLoc dl, SDValue Callee, SDValue &Chain,
|
|||||||
SDValue
|
SDValue
|
||||||
PIC16TargetLowering::LowerCall(SDValue Chain, SDValue Callee,
|
PIC16TargetLowering::LowerCall(SDValue Chain, SDValue Callee,
|
||||||
CallingConv::ID CallConv, bool isVarArg,
|
CallingConv::ID CallConv, bool isVarArg,
|
||||||
bool isTailCall,
|
bool &isTailCall,
|
||||||
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
||||||
const SmallVectorImpl<ISD::InputArg> &Ins,
|
const SmallVectorImpl<ISD::InputArg> &Ins,
|
||||||
DebugLoc dl, SelectionDAG &DAG,
|
DebugLoc dl, SelectionDAG &DAG,
|
||||||
SmallVectorImpl<SDValue> &InVals) {
|
SmallVectorImpl<SDValue> &InVals) {
|
||||||
|
// PIC16 target does not yet support tail call optimization.
|
||||||
|
isTailCall = false;
|
||||||
|
|
||||||
assert(Callee.getValueType() == MVT::i16 &&
|
assert(Callee.getValueType() == MVT::i16 &&
|
||||||
"Don't know how to legalize this call node!!!");
|
"Don't know how to legalize this call node!!!");
|
||||||
|
@ -143,7 +143,7 @@ namespace llvm {
|
|||||||
|
|
||||||
virtual SDValue
|
virtual SDValue
|
||||||
LowerCall(SDValue Chain, SDValue Callee,
|
LowerCall(SDValue Chain, SDValue Callee,
|
||||||
CallingConv::ID CallConv, bool isVarArg, bool isTailCall,
|
CallingConv::ID CallConv, bool isVarArg, bool &isTailCall,
|
||||||
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
||||||
const SmallVectorImpl<ISD::InputArg> &Ins,
|
const SmallVectorImpl<ISD::InputArg> &Ins,
|
||||||
DebugLoc dl, SelectionDAG &DAG,
|
DebugLoc dl, SelectionDAG &DAG,
|
||||||
|
@ -2673,11 +2673,15 @@ PPCTargetLowering::FinishCall(CallingConv::ID CallConv, DebugLoc dl,
|
|||||||
SDValue
|
SDValue
|
||||||
PPCTargetLowering::LowerCall(SDValue Chain, SDValue Callee,
|
PPCTargetLowering::LowerCall(SDValue Chain, SDValue Callee,
|
||||||
CallingConv::ID CallConv, bool isVarArg,
|
CallingConv::ID CallConv, bool isVarArg,
|
||||||
bool isTailCall,
|
bool &isTailCall,
|
||||||
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
||||||
const SmallVectorImpl<ISD::InputArg> &Ins,
|
const SmallVectorImpl<ISD::InputArg> &Ins,
|
||||||
DebugLoc dl, SelectionDAG &DAG,
|
DebugLoc dl, SelectionDAG &DAG,
|
||||||
SmallVectorImpl<SDValue> &InVals) {
|
SmallVectorImpl<SDValue> &InVals) {
|
||||||
|
if (isTailCall)
|
||||||
|
isTailCall = IsEligibleForTailCallOptimization(Callee, CallConv, isVarArg,
|
||||||
|
Ins, DAG);
|
||||||
|
|
||||||
if (PPCSubTarget.isSVR4ABI() && !PPCSubTarget.isPPC64()) {
|
if (PPCSubTarget.isSVR4ABI() && !PPCSubTarget.isPPC64()) {
|
||||||
return LowerCall_SVR4(Chain, Callee, CallConv, isVarArg,
|
return LowerCall_SVR4(Chain, Callee, CallConv, isVarArg,
|
||||||
isTailCall, Outs, Ins,
|
isTailCall, Outs, Ins,
|
||||||
@ -2700,10 +2704,6 @@ PPCTargetLowering::LowerCall_SVR4(SDValue Chain, SDValue Callee,
|
|||||||
// See PPCTargetLowering::LowerFormalArguments_SVR4() for a description
|
// See PPCTargetLowering::LowerFormalArguments_SVR4() for a description
|
||||||
// of the 32-bit SVR4 ABI stack frame layout.
|
// of the 32-bit SVR4 ABI stack frame layout.
|
||||||
|
|
||||||
assert((!isTailCall ||
|
|
||||||
(CallConv == CallingConv::Fast && PerformTailCallOpt)) &&
|
|
||||||
"IsEligibleForTailCallOptimization missed a case!");
|
|
||||||
|
|
||||||
assert((CallConv == CallingConv::C ||
|
assert((CallConv == CallingConv::C ||
|
||||||
CallConv == CallingConv::Fast) && "Unknown calling convention!");
|
CallConv == CallingConv::Fast) && "Unknown calling convention!");
|
||||||
|
|
||||||
|
@ -345,13 +345,6 @@ namespace llvm {
|
|||||||
/// the offset of the target addressing mode.
|
/// the offset of the target addressing mode.
|
||||||
virtual bool isLegalAddressImmediate(GlobalValue *GV) const;
|
virtual bool isLegalAddressImmediate(GlobalValue *GV) const;
|
||||||
|
|
||||||
virtual bool
|
|
||||||
IsEligibleForTailCallOptimization(SDValue Callee,
|
|
||||||
CallingConv::ID CalleeCC,
|
|
||||||
bool isVarArg,
|
|
||||||
const SmallVectorImpl<ISD::InputArg> &Ins,
|
|
||||||
SelectionDAG& DAG) const;
|
|
||||||
|
|
||||||
virtual bool isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const;
|
virtual bool isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const;
|
||||||
|
|
||||||
virtual EVT getOptimalMemOpType(uint64_t Size, unsigned Align,
|
virtual EVT getOptimalMemOpType(uint64_t Size, unsigned Align,
|
||||||
@ -365,6 +358,13 @@ namespace llvm {
|
|||||||
SDValue getFramePointerFrameIndex(SelectionDAG & DAG) const;
|
SDValue getFramePointerFrameIndex(SelectionDAG & DAG) const;
|
||||||
SDValue getReturnAddrFrameIndex(SelectionDAG & DAG) const;
|
SDValue getReturnAddrFrameIndex(SelectionDAG & DAG) const;
|
||||||
|
|
||||||
|
bool
|
||||||
|
IsEligibleForTailCallOptimization(SDValue Callee,
|
||||||
|
CallingConv::ID CalleeCC,
|
||||||
|
bool isVarArg,
|
||||||
|
const SmallVectorImpl<ISD::InputArg> &Ins,
|
||||||
|
SelectionDAG& DAG) const;
|
||||||
|
|
||||||
SDValue EmitTailCallLoadFPAndRetAddr(SelectionDAG & DAG,
|
SDValue EmitTailCallLoadFPAndRetAddr(SelectionDAG & DAG,
|
||||||
int SPDiff,
|
int SPDiff,
|
||||||
SDValue Chain,
|
SDValue Chain,
|
||||||
@ -431,7 +431,7 @@ namespace llvm {
|
|||||||
|
|
||||||
virtual SDValue
|
virtual SDValue
|
||||||
LowerCall(SDValue Chain, SDValue Callee,
|
LowerCall(SDValue Chain, SDValue Callee,
|
||||||
CallingConv::ID CallConv, bool isVarArg, bool isTailCall,
|
CallingConv::ID CallConv, bool isVarArg, bool &isTailCall,
|
||||||
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
||||||
const SmallVectorImpl<ISD::InputArg> &Ins,
|
const SmallVectorImpl<ISD::InputArg> &Ins,
|
||||||
DebugLoc dl, SelectionDAG &DAG,
|
DebugLoc dl, SelectionDAG &DAG,
|
||||||
|
@ -252,11 +252,13 @@ SparcTargetLowering::LowerFormalArguments(SDValue Chain,
|
|||||||
SDValue
|
SDValue
|
||||||
SparcTargetLowering::LowerCall(SDValue Chain, SDValue Callee,
|
SparcTargetLowering::LowerCall(SDValue Chain, SDValue Callee,
|
||||||
CallingConv::ID CallConv, bool isVarArg,
|
CallingConv::ID CallConv, bool isVarArg,
|
||||||
bool isTailCall,
|
bool &isTailCall,
|
||||||
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
||||||
const SmallVectorImpl<ISD::InputArg> &Ins,
|
const SmallVectorImpl<ISD::InputArg> &Ins,
|
||||||
DebugLoc dl, SelectionDAG &DAG,
|
DebugLoc dl, SelectionDAG &DAG,
|
||||||
SmallVectorImpl<SDValue> &InVals) {
|
SmallVectorImpl<SDValue> &InVals) {
|
||||||
|
// Sparc target does not yet support tail call optimization.
|
||||||
|
isTailCall = false;
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
// Analyze operands of the call, assigning locations to each operand.
|
// Analyze operands of the call, assigning locations to each operand.
|
||||||
|
@ -87,7 +87,7 @@ namespace llvm {
|
|||||||
virtual SDValue
|
virtual SDValue
|
||||||
LowerCall(SDValue Chain, SDValue Callee,
|
LowerCall(SDValue Chain, SDValue Callee,
|
||||||
CallingConv::ID CallConv, bool isVarArg,
|
CallingConv::ID CallConv, bool isVarArg,
|
||||||
bool isTailCall,
|
bool &isTailCall,
|
||||||
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
||||||
const SmallVectorImpl<ISD::InputArg> &Ins,
|
const SmallVectorImpl<ISD::InputArg> &Ins,
|
||||||
DebugLoc dl, SelectionDAG &DAG,
|
DebugLoc dl, SelectionDAG &DAG,
|
||||||
|
@ -250,11 +250,13 @@ SystemZTargetLowering::LowerFormalArguments(SDValue Chain,
|
|||||||
SDValue
|
SDValue
|
||||||
SystemZTargetLowering::LowerCall(SDValue Chain, SDValue Callee,
|
SystemZTargetLowering::LowerCall(SDValue Chain, SDValue Callee,
|
||||||
CallingConv::ID CallConv, bool isVarArg,
|
CallingConv::ID CallConv, bool isVarArg,
|
||||||
bool isTailCall,
|
bool &isTailCall,
|
||||||
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
||||||
const SmallVectorImpl<ISD::InputArg> &Ins,
|
const SmallVectorImpl<ISD::InputArg> &Ins,
|
||||||
DebugLoc dl, SelectionDAG &DAG,
|
DebugLoc dl, SelectionDAG &DAG,
|
||||||
SmallVectorImpl<SDValue> &InVals) {
|
SmallVectorImpl<SDValue> &InVals) {
|
||||||
|
// SystemZ target does not yet support tail call optimization.
|
||||||
|
isTailCall = false;
|
||||||
|
|
||||||
switch (CallConv) {
|
switch (CallConv) {
|
||||||
default:
|
default:
|
||||||
|
@ -125,7 +125,7 @@ namespace llvm {
|
|||||||
SmallVectorImpl<SDValue> &InVals);
|
SmallVectorImpl<SDValue> &InVals);
|
||||||
virtual SDValue
|
virtual SDValue
|
||||||
LowerCall(SDValue Chain, SDValue Callee,
|
LowerCall(SDValue Chain, SDValue Callee,
|
||||||
CallingConv::ID CallConv, bool isVarArg, bool isTailCall,
|
CallingConv::ID CallConv, bool isVarArg, bool &isTailCall,
|
||||||
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
||||||
const SmallVectorImpl<ISD::InputArg> &Ins,
|
const SmallVectorImpl<ISD::InputArg> &Ins,
|
||||||
DebugLoc dl, SelectionDAG &DAG,
|
DebugLoc dl, SelectionDAG &DAG,
|
||||||
|
@ -1436,6 +1436,12 @@ CreateCopyOfByValArgument(SDValue Src, SDValue Dst, SDValue Chain,
|
|||||||
/*AlwaysInline=*/true, NULL, 0, NULL, 0);
|
/*AlwaysInline=*/true, NULL, 0, NULL, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// FuncIsMadeTailCallSafe - Return true if the function is being made into
|
||||||
|
/// a tailcall target by changing its ABI.
|
||||||
|
static bool FuncIsMadeTailCallSafe(CallingConv::ID CC) {
|
||||||
|
return PerformTailCallOpt && CC == CallingConv::Fast;
|
||||||
|
}
|
||||||
|
|
||||||
SDValue
|
SDValue
|
||||||
X86TargetLowering::LowerMemArgument(SDValue Chain,
|
X86TargetLowering::LowerMemArgument(SDValue Chain,
|
||||||
CallingConv::ID CallConv,
|
CallingConv::ID CallConv,
|
||||||
@ -1446,7 +1452,7 @@ X86TargetLowering::LowerMemArgument(SDValue Chain,
|
|||||||
unsigned i) {
|
unsigned i) {
|
||||||
// Create the nodes corresponding to a load from this parameter slot.
|
// Create the nodes corresponding to a load from this parameter slot.
|
||||||
ISD::ArgFlagsTy Flags = Ins[i].Flags;
|
ISD::ArgFlagsTy Flags = Ins[i].Flags;
|
||||||
bool AlwaysUseMutable = X86::IsEligibleForTailCallOpt(CallConv);
|
bool AlwaysUseMutable = FuncIsMadeTailCallSafe(CallConv);
|
||||||
bool isImmutable = !AlwaysUseMutable && !Flags.isByVal();
|
bool isImmutable = !AlwaysUseMutable && !Flags.isByVal();
|
||||||
EVT ValVT;
|
EVT ValVT;
|
||||||
|
|
||||||
@ -1583,8 +1589,8 @@ X86TargetLowering::LowerFormalArguments(SDValue Chain,
|
|||||||
}
|
}
|
||||||
|
|
||||||
unsigned StackSize = CCInfo.getNextStackOffset();
|
unsigned StackSize = CCInfo.getNextStackOffset();
|
||||||
// align stack specially for tail calls
|
// Align stack specially for tail calls.
|
||||||
if (X86::IsEligibleForTailCallOpt(CallConv))
|
if (FuncIsMadeTailCallSafe(CallConv))
|
||||||
StackSize = GetAlignedArgumentStackSize(StackSize, DAG);
|
StackSize = GetAlignedArgumentStackSize(StackSize, DAG);
|
||||||
|
|
||||||
// If the function takes variable number of arguments, make a frame index for
|
// If the function takes variable number of arguments, make a frame index for
|
||||||
@ -1770,7 +1776,7 @@ EmitTailCallStoreRetAddr(SelectionDAG & DAG, MachineFunction &MF,
|
|||||||
SDValue
|
SDValue
|
||||||
X86TargetLowering::LowerCall(SDValue Chain, SDValue Callee,
|
X86TargetLowering::LowerCall(SDValue Chain, SDValue Callee,
|
||||||
CallingConv::ID CallConv, bool isVarArg,
|
CallingConv::ID CallConv, bool isVarArg,
|
||||||
bool isTailCall,
|
bool &isTailCall,
|
||||||
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
||||||
const SmallVectorImpl<ISD::InputArg> &Ins,
|
const SmallVectorImpl<ISD::InputArg> &Ins,
|
||||||
DebugLoc dl, SelectionDAG &DAG,
|
DebugLoc dl, SelectionDAG &DAG,
|
||||||
@ -1779,8 +1785,11 @@ X86TargetLowering::LowerCall(SDValue Chain, SDValue Callee,
|
|||||||
bool Is64Bit = Subtarget->is64Bit();
|
bool Is64Bit = Subtarget->is64Bit();
|
||||||
bool IsStructRet = CallIsStructReturn(Outs);
|
bool IsStructRet = CallIsStructReturn(Outs);
|
||||||
|
|
||||||
assert((!isTailCall || X86::IsEligibleForTailCallOpt(CallConv)) &&
|
if (isTailCall)
|
||||||
"Call is not eligible for tail call optimization!");
|
// Check if it's really possible to do a tail call.
|
||||||
|
isTailCall = IsEligibleForTailCallOptimization(Callee, CallConv, isVarArg,
|
||||||
|
Ins, DAG);
|
||||||
|
|
||||||
assert(!(isVarArg && CallConv == CallingConv::Fast) &&
|
assert(!(isVarArg && CallConv == CallingConv::Fast) &&
|
||||||
"Var args not supported with calling convention fastcc");
|
"Var args not supported with calling convention fastcc");
|
||||||
|
|
||||||
@ -1792,7 +1801,7 @@ X86TargetLowering::LowerCall(SDValue Chain, SDValue Callee,
|
|||||||
|
|
||||||
// Get a count of how many bytes are to be pushed on the stack.
|
// Get a count of how many bytes are to be pushed on the stack.
|
||||||
unsigned NumBytes = CCInfo.getNextStackOffset();
|
unsigned NumBytes = CCInfo.getNextStackOffset();
|
||||||
if (X86::IsEligibleForTailCallOpt(CallConv))
|
if (FuncIsMadeTailCallSafe(CallConv))
|
||||||
NumBytes = GetAlignedArgumentStackSize(NumBytes, DAG);
|
NumBytes = GetAlignedArgumentStackSize(NumBytes, DAG);
|
||||||
|
|
||||||
int FPDiff = 0;
|
int FPDiff = 0;
|
||||||
@ -2230,8 +2239,10 @@ X86TargetLowering::IsEligibleForTailCallOptimization(SDValue Callee,
|
|||||||
bool isVarArg,
|
bool isVarArg,
|
||||||
const SmallVectorImpl<ISD::InputArg> &Ins,
|
const SmallVectorImpl<ISD::InputArg> &Ins,
|
||||||
SelectionDAG& DAG) const {
|
SelectionDAG& DAG) const {
|
||||||
return X86::IsEligibleForTailCallOpt(CalleeCC) &&
|
if (CalleeCC == CallingConv::Fast &&
|
||||||
DAG.getMachineFunction().getFunction()->getCallingConv() == CalleeCC;
|
DAG.getMachineFunction().getFunction()->getCallingConv() == CalleeCC)
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
FastISel *
|
FastISel *
|
||||||
@ -2304,10 +2315,6 @@ bool X86::isOffsetSuitableForCodeModel(int64_t Offset, CodeModel::Model M,
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool X86::IsEligibleForTailCallOpt(CallingConv::ID CC) {
|
|
||||||
return PerformTailCallOpt && CC == CallingConv::Fast;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// TranslateX86CC - do a one to one translation of a ISD::CondCode to the X86
|
/// TranslateX86CC - do a one to one translation of a ISD::CondCode to the X86
|
||||||
/// specific condition code, returning the condition code and the LHS/RHS of the
|
/// specific condition code, returning the condition code and the LHS/RHS of the
|
||||||
/// comparison to make.
|
/// comparison to make.
|
||||||
|
@ -362,10 +362,6 @@ namespace llvm {
|
|||||||
/// fit into displacement field of the instruction.
|
/// fit into displacement field of the instruction.
|
||||||
bool isOffsetSuitableForCodeModel(int64_t Offset, CodeModel::Model M,
|
bool isOffsetSuitableForCodeModel(int64_t Offset, CodeModel::Model M,
|
||||||
bool hasSymbolicDisplacement = true);
|
bool hasSymbolicDisplacement = true);
|
||||||
|
|
||||||
/// IsEligibleForTailCallOpt - Return true if it's legal to perform tail call
|
|
||||||
/// optimization for the given calling convention.
|
|
||||||
bool IsEligibleForTailCallOpt(CallingConv::ID CC);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//===--------------------------------------------------------------------===//
|
//===--------------------------------------------------------------------===//
|
||||||
@ -550,16 +546,6 @@ namespace llvm {
|
|||||||
return !X86ScalarSSEf64 || VT == MVT::f80;
|
return !X86ScalarSSEf64 || VT == MVT::f80;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// IsEligibleForTailCallOptimization - Check whether the call is eligible
|
|
||||||
/// for tail call optimization. Targets which want to do tail call
|
|
||||||
/// optimization should implement this function.
|
|
||||||
virtual bool
|
|
||||||
IsEligibleForTailCallOptimization(SDValue Callee,
|
|
||||||
CallingConv::ID CalleeCC,
|
|
||||||
bool isVarArg,
|
|
||||||
const SmallVectorImpl<ISD::InputArg> &Ins,
|
|
||||||
SelectionDAG& DAG) const;
|
|
||||||
|
|
||||||
virtual const X86Subtarget* getSubtarget() {
|
virtual const X86Subtarget* getSubtarget() {
|
||||||
return Subtarget;
|
return Subtarget;
|
||||||
}
|
}
|
||||||
@ -637,6 +623,15 @@ namespace llvm {
|
|||||||
ISD::ArgFlagsTy Flags);
|
ISD::ArgFlagsTy Flags);
|
||||||
|
|
||||||
// Call lowering helpers.
|
// Call lowering helpers.
|
||||||
|
|
||||||
|
/// 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,
|
||||||
|
CallingConv::ID CalleeCC,
|
||||||
|
bool isVarArg,
|
||||||
|
const SmallVectorImpl<ISD::InputArg> &Ins,
|
||||||
|
SelectionDAG& DAG) const;
|
||||||
bool IsCalleePop(bool isVarArg, CallingConv::ID CallConv);
|
bool IsCalleePop(bool isVarArg, CallingConv::ID CallConv);
|
||||||
SDValue EmitTailCallLoadRetAddr(SelectionDAG &DAG, SDValue &OutRetAddr,
|
SDValue EmitTailCallLoadRetAddr(SelectionDAG &DAG, SDValue &OutRetAddr,
|
||||||
SDValue Chain, bool IsTailCall, bool Is64Bit,
|
SDValue Chain, bool IsTailCall, bool Is64Bit,
|
||||||
@ -712,7 +707,7 @@ namespace llvm {
|
|||||||
SmallVectorImpl<SDValue> &InVals);
|
SmallVectorImpl<SDValue> &InVals);
|
||||||
virtual SDValue
|
virtual SDValue
|
||||||
LowerCall(SDValue Chain, SDValue Callee,
|
LowerCall(SDValue Chain, SDValue Callee,
|
||||||
CallingConv::ID CallConv, bool isVarArg, bool isTailCall,
|
CallingConv::ID CallConv, bool isVarArg, bool &isTailCall,
|
||||||
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
||||||
const SmallVectorImpl<ISD::InputArg> &Ins,
|
const SmallVectorImpl<ISD::InputArg> &Ins,
|
||||||
DebugLoc dl, SelectionDAG &DAG,
|
DebugLoc dl, SelectionDAG &DAG,
|
||||||
|
@ -611,11 +611,13 @@ SDValue XCoreTargetLowering::LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) {
|
|||||||
SDValue
|
SDValue
|
||||||
XCoreTargetLowering::LowerCall(SDValue Chain, SDValue Callee,
|
XCoreTargetLowering::LowerCall(SDValue Chain, SDValue Callee,
|
||||||
CallingConv::ID CallConv, bool isVarArg,
|
CallingConv::ID CallConv, bool isVarArg,
|
||||||
bool isTailCall,
|
bool &isTailCall,
|
||||||
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
||||||
const SmallVectorImpl<ISD::InputArg> &Ins,
|
const SmallVectorImpl<ISD::InputArg> &Ins,
|
||||||
DebugLoc dl, SelectionDAG &DAG,
|
DebugLoc dl, SelectionDAG &DAG,
|
||||||
SmallVectorImpl<SDValue> &InVals) {
|
SmallVectorImpl<SDValue> &InVals) {
|
||||||
|
// XCore target does not yet support tail call optimization.
|
||||||
|
isTailCall = false;
|
||||||
|
|
||||||
// For now, only CallingConv::C implemented
|
// For now, only CallingConv::C implemented
|
||||||
switch (CallConv)
|
switch (CallConv)
|
||||||
|
@ -149,7 +149,7 @@ namespace llvm {
|
|||||||
virtual SDValue
|
virtual SDValue
|
||||||
LowerCall(SDValue Chain, SDValue Callee,
|
LowerCall(SDValue Chain, SDValue Callee,
|
||||||
CallingConv::ID CallConv, bool isVarArg,
|
CallingConv::ID CallConv, bool isVarArg,
|
||||||
bool isTailCall,
|
bool &isTailCall,
|
||||||
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
||||||
const SmallVectorImpl<ISD::InputArg> &Ins,
|
const SmallVectorImpl<ISD::InputArg> &Ins,
|
||||||
DebugLoc dl, SelectionDAG &DAG,
|
DebugLoc dl, SelectionDAG &DAG,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user