diff options
author | Evan Cheng <evan.cheng@apple.com> | 2010-06-19 01:01:32 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2010-06-19 01:01:32 +0000 |
commit | 0110ac66ebd1e59e6ac163e13670f36d091084f6 (patch) | |
tree | c89c80f7118f6078385c7e2f0f5af8fa613fa7fe /lib/Target/ARM | |
parent | a938cfb13ae2c6f0219eebb891e96de4ac8bb132 (diff) | |
download | external_llvm-0110ac66ebd1e59e6ac163e13670f36d091084f6.zip external_llvm-0110ac66ebd1e59e6ac163e13670f36d091084f6.tar.gz external_llvm-0110ac66ebd1e59e6ac163e13670f36d091084f6.tar.bz2 |
Disable sibcall optimization for Thumb1 for now since Thumb1RegisterInfo::emitEpilogue is not expecting them.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@106368 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/ARM')
-rw-r--r-- | lib/Target/ARM/ARMISelLowering.cpp | 25 |
1 files changed, 17 insertions, 8 deletions
diff --git a/lib/Target/ARM/ARMISelLowering.cpp b/lib/Target/ARM/ARMISelLowering.cpp index 3dfd080..d0c4022 100644 --- a/lib/Target/ARM/ARMISelLowering.cpp +++ b/lib/Target/ARM/ARMISelLowering.cpp @@ -1389,7 +1389,6 @@ ARMTargetLowering::IsEligibleForTailCallOptimization(SDValue Callee, const SmallVectorImpl<ISD::OutputArg> &Outs, const SmallVectorImpl<ISD::InputArg> &Ins, SelectionDAG& DAG) const { - const Function *CallerF = DAG.getMachineFunction().getFunction(); CallingConv::ID CallerCC = CallerF->getCallingConv(); bool CCMatch = CallerCC == CalleeCC; @@ -1407,19 +1406,29 @@ ARMTargetLowering::IsEligibleForTailCallOptimization(SDValue Callee, if (isCalleeStructRet || isCallerStructRet) return false; - // On Thumb, for the moment, we can only do this to functions defined in this - // compilation, or to indirect calls. A Thumb B to an ARM function is not - // easily fixed up in the linker, unlike BL. - if (Subtarget->isThumb()) { - if (GlobalAddressSDNode *G = dyn_cast<GlobalAddressSDNode>(Callee)) { + // FIXME: Completely disable sibcal for Thumb1 since Thumb1RegisterInfo:: + // emitEpilogue is not ready for them. + if (Subtarget->isThumb1Only()) + return false; + + if (isa<ExternalSymbolSDNode>(Callee)) + return false; + + if (GlobalAddressSDNode *G = dyn_cast<GlobalAddressSDNode>(Callee)) { + if (Subtarget->isThumb1Only()) + return false; + + // On Thumb, for the moment, we can only do this to functions defined in this + // compilation, or to indirect calls. A Thumb B to an ARM function is not + // easily fixed up in the linker, unlike BL. + if (Subtarget->isThumb()) { const GlobalValue *GV = G->getGlobal(); if (GV->isDeclaration() || GV->isWeakForLinker()) return false; - } else if (isa<ExternalSymbolSDNode>(Callee)) { - return false; } } + // If the calling conventions do not match, then we'd better make sure the // results are returned in the same way as what the caller expects. if (!CCMatch) { |