forked from OSchip/llvm-project
[ARM] Avoid redundant checks for isThumb1Only() after supportsTailCall()
supportsTailCall() has two callers. Both of them double-check isThumb1Only(), and refuse to proceed with tail-calling in that case. Therefore, it makes sense to move this check to ARMSubtarget::initSubtargetFeatures, where SupportsTailCall is initialized; and to eliminate the extra checks at the call sites. Following a review comment, added an "assert(supportsTailCall())" in IsEligibleForTailCall. NFC. llvm-svn: 248703
This commit is contained in:
parent
c8c77d46ef
commit
ad8a0638f7
|
@ -2056,6 +2056,8 @@ ARMTargetLowering::IsEligibleForTailCallOptimization(SDValue Callee,
|
|||
CallingConv::ID CallerCC = CallerF->getCallingConv();
|
||||
bool CCMatch = CallerCC == CalleeCC;
|
||||
|
||||
assert(Subtarget->supportsTailCall());
|
||||
|
||||
// Look for obvious safe cases to perform tail call optimization that do not
|
||||
// require ABI changes. This is what gcc calls sibcall.
|
||||
|
||||
|
@ -2075,26 +2077,6 @@ ARMTargetLowering::IsEligibleForTailCallOptimization(SDValue Callee,
|
|||
if (isCalleeStructRet || isCallerStructRet)
|
||||
return false;
|
||||
|
||||
// FIXME: Completely disable sibcall for Thumb1 since ThumbRegisterInfo::
|
||||
// emitEpilogue is not ready for them. Thumb tail calls also use t2B, as
|
||||
// the Thumb1 16-bit unconditional branch doesn't have sufficient relocation
|
||||
// support in the assembler and linker to be used. This would need to be
|
||||
// fixed to fully support tail calls in Thumb1.
|
||||
//
|
||||
// Doing this is tricky, since the LDM/POP instruction on Thumb doesn't take
|
||||
// LR. This means if we need to reload LR, it takes an extra instructions,
|
||||
// which outweighs the value of the tail call; but here we don't know yet
|
||||
// whether LR is going to be used. Probably the right approach is to
|
||||
// generate the tail call here and turn it back into CALL/RET in
|
||||
// emitEpilogue if LR is used.
|
||||
|
||||
// Thumb1 PIC calls to external symbols use BX, so they can be tail calls,
|
||||
// but we need to make sure there are enough registers; the only valid
|
||||
// registers are the 4 used for parameters. We don't currently do this
|
||||
// case.
|
||||
if (Subtarget->isThumb1Only())
|
||||
return false;
|
||||
|
||||
// Externally-defined functions with weak linkage should not be
|
||||
// tail-called on ARM when the OS does not support dynamic
|
||||
// pre-emption of symbols, as the AAELF spec requires normal calls
|
||||
|
@ -2442,7 +2424,7 @@ bool ARMTargetLowering::mayBeEmittedAsTailCall(CallInst *CI) const {
|
|||
if (!CI->isTailCall() || Attr.getValueAsString() == "true")
|
||||
return false;
|
||||
|
||||
return !Subtarget->isThumb1Only();
|
||||
return true;
|
||||
}
|
||||
|
||||
// Trying to write a 64 bit value so need to split into two 32 bit values first,
|
||||
|
|
|
@ -193,10 +193,28 @@ void ARMSubtarget::initSubtargetFeatures(StringRef CPU, StringRef FS) {
|
|||
if (isTargetNaCl())
|
||||
stackAlignment = 16;
|
||||
|
||||
if (isTargetMachO())
|
||||
SupportsTailCall = !isTargetIOS() || !getTargetTriple().isOSVersionLT(5, 0);
|
||||
else
|
||||
SupportsTailCall = !isThumb1Only();
|
||||
// FIXME: Completely disable sibcall for Thumb1 since ThumbRegisterInfo::
|
||||
// emitEpilogue is not ready for them. Thumb tail calls also use t2B, as
|
||||
// the Thumb1 16-bit unconditional branch doesn't have sufficient relocation
|
||||
// support in the assembler and linker to be used. This would need to be
|
||||
// fixed to fully support tail calls in Thumb1.
|
||||
//
|
||||
// Doing this is tricky, since the LDM/POP instruction on Thumb doesn't take
|
||||
// LR. This means if we need to reload LR, it takes an extra instructions,
|
||||
// which outweighs the value of the tail call; but here we don't know yet
|
||||
// whether LR is going to be used. Probably the right approach is to
|
||||
// generate the tail call here and turn it back into CALL/RET in
|
||||
// emitEpilogue if LR is used.
|
||||
|
||||
// Thumb1 PIC calls to external symbols use BX, so they can be tail calls,
|
||||
// but we need to make sure there are enough registers; the only valid
|
||||
// registers are the 4 used for parameters. We don't currently do this
|
||||
// case.
|
||||
|
||||
SupportsTailCall = !isThumb1Only();
|
||||
|
||||
if (isTargetMachO() && isTargetIOS() && getTargetTriple().isOSVersionLT(5, 0))
|
||||
SupportsTailCall = false;
|
||||
|
||||
switch (IT) {
|
||||
case DefaultIT:
|
||||
|
|
Loading…
Reference in New Issue