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 | f3c01f3ef6b1e1c448ef8c0987068e646b0a4ece (patch) | |
| tree | e34fc83c106d3840a12beda1de2f34c3fc1579ed /llvm/lib/Target/ARM/ARMISelLowering.cpp | |
| parent | 42105b2976a77f90c17a8126141ad81ab6edbf28 (diff) | |
| download | bcm5719-llvm-f3c01f3ef6b1e1c448ef8c0987068e646b0a4ece.tar.gz bcm5719-llvm-f3c01f3ef6b1e1c448ef8c0987068e646b0a4ece.zip | |
Disable sibcall optimization for Thumb1 for now since Thumb1RegisterInfo::emitEpilogue is not expecting them.
llvm-svn: 106368
Diffstat (limited to 'llvm/lib/Target/ARM/ARMISelLowering.cpp')
| -rw-r--r-- | llvm/lib/Target/ARM/ARMISelLowering.cpp | 25 |
1 files changed, 17 insertions, 8 deletions
diff --git a/llvm/lib/Target/ARM/ARMISelLowering.cpp b/llvm/lib/Target/ARM/ARMISelLowering.cpp index 3dfd080c0af..d0c40229d40 100644 --- a/llvm/lib/Target/ARM/ARMISelLowering.cpp +++ b/llvm/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) { |

