forked from OSchip/llvm-project
Reenable tail calls for iOS 5.0 and later.
llvm-svn: 141370
This commit is contained in:
parent
942bbcea25
commit
8decdc472f
|
@ -1222,8 +1222,8 @@ ARMTargetLowering::LowerCall(SDValue Chain, SDValue Callee,
|
||||||
MachineFunction &MF = DAG.getMachineFunction();
|
MachineFunction &MF = DAG.getMachineFunction();
|
||||||
bool IsStructRet = (Outs.empty()) ? false : Outs[0].Flags.isSRet();
|
bool IsStructRet = (Outs.empty()) ? false : Outs[0].Flags.isSRet();
|
||||||
bool IsSibCall = false;
|
bool IsSibCall = false;
|
||||||
// Temporarily disable tail calls so things don't break.
|
// Disable tail calls if they're not supported.
|
||||||
if (!EnableARMTailCalls)
|
if (!EnableARMTailCalls && !Subtarget->supportsTailCall())
|
||||||
isTailCall = false;
|
isTailCall = false;
|
||||||
if (isTailCall) {
|
if (isTailCall) {
|
||||||
// Check if it's really possible to do a tail call.
|
// Check if it's really possible to do a tail call.
|
||||||
|
|
|
@ -60,6 +60,7 @@ ARMSubtarget::ARMSubtarget(const std::string &TT, const std::string &CPU,
|
||||||
, PostRAScheduler(false)
|
, PostRAScheduler(false)
|
||||||
, IsR9Reserved(ReserveR9)
|
, IsR9Reserved(ReserveR9)
|
||||||
, UseMovt(false)
|
, UseMovt(false)
|
||||||
|
, SupportsTailCall(false)
|
||||||
, HasFP16(false)
|
, HasFP16(false)
|
||||||
, HasD16(false)
|
, HasD16(false)
|
||||||
, HasHardwareDivide(false)
|
, HasHardwareDivide(false)
|
||||||
|
@ -113,6 +114,8 @@ ARMSubtarget::ARMSubtarget(const std::string &TT, const std::string &CPU,
|
||||||
else {
|
else {
|
||||||
IsR9Reserved = ReserveR9 | !HasV6Ops;
|
IsR9Reserved = ReserveR9 | !HasV6Ops;
|
||||||
UseMovt = DarwinUseMOVT && hasV6T2Ops();
|
UseMovt = DarwinUseMOVT && hasV6T2Ops();
|
||||||
|
const Triple &T = getTargetTriple();
|
||||||
|
SupportsTailCall = T.getOS() == Triple::IOS && !T.isOSVersionLT(5, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!isThumb() || hasThumb2())
|
if (!isThumb() || hasThumb2())
|
||||||
|
|
|
@ -93,6 +93,11 @@ protected:
|
||||||
/// imms (including global addresses).
|
/// imms (including global addresses).
|
||||||
bool UseMovt;
|
bool UseMovt;
|
||||||
|
|
||||||
|
/// SupportsTailCall - True if the OS supports tail call. The dynamic linker
|
||||||
|
/// must be able to synthesize call stubs for interworking between ARM and
|
||||||
|
/// Thumb.
|
||||||
|
bool SupportsTailCall;
|
||||||
|
|
||||||
/// HasFP16 - True if subtarget supports half-precision FP (We support VFP+HF
|
/// HasFP16 - True if subtarget supports half-precision FP (We support VFP+HF
|
||||||
/// only so far)
|
/// only so far)
|
||||||
bool HasFP16;
|
bool HasFP16;
|
||||||
|
@ -234,6 +239,7 @@ protected:
|
||||||
bool isR9Reserved() const { return IsR9Reserved; }
|
bool isR9Reserved() const { return IsR9Reserved; }
|
||||||
|
|
||||||
bool useMovt() const { return UseMovt && hasV6T2Ops(); }
|
bool useMovt() const { return UseMovt && hasV6T2Ops(); }
|
||||||
|
bool supportsTailCall() const { return SupportsTailCall; }
|
||||||
|
|
||||||
bool allowsUnalignedMem() const { return AllowsUnalignedMem; }
|
bool allowsUnalignedMem() const { return AllowsUnalignedMem; }
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,10 @@
|
||||||
; RUN: llc < %s -mtriple=armv6-apple-darwin -mattr=+vfp2 -arm-tail-calls | FileCheck %s -check-prefix=CHECKV6
|
; RUN: llc < %s -mtriple=armv6-apple-darwin -mattr=+vfp2 -arm-tail-calls | FileCheck %s -check-prefix=CHECKV6
|
||||||
; RUN: llc < %s -mtriple=armv6-linux-gnueabi -relocation-model=pic -mattr=+vfp2 -arm-tail-calls | FileCheck %s -check-prefix=CHECKELF
|
; RUN: llc < %s -mtriple=armv6-linux-gnueabi -relocation-model=pic -mattr=+vfp2 -arm-tail-calls | FileCheck %s -check-prefix=CHECKELF
|
||||||
; RUN: llc < %s -mtriple=thumbv7-apple-darwin -arm-tail-calls | FileCheck %s -check-prefix=CHECKT2D
|
; RUN: llc < %s -mtriple=thumbv7-apple-darwin -arm-tail-calls | FileCheck %s -check-prefix=CHECKT2D
|
||||||
|
; RUN: llc < %s -mtriple=thumbv7-apple-ios5.0 | FileCheck %s -check-prefix=CHECKT2D
|
||||||
|
|
||||||
|
; Enable tailcall optimization for iOS 5.0
|
||||||
|
; rdar://9120031
|
||||||
|
|
||||||
@t = weak global i32 ()* null ; <i32 ()**> [#uses=1]
|
@t = weak global i32 ()* null ; <i32 ()**> [#uses=1]
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue