diff options
author | Quentin Colombet <qcolombet@apple.com> | 2012-10-27 01:10:17 +0000 |
---|---|---|
committer | Quentin Colombet <qcolombet@apple.com> | 2012-10-27 01:10:17 +0000 |
commit | 80acd97266f6f165285ae9303dea9654f87a2a87 (patch) | |
tree | b1b7d8a44ee9ad96779e94abdbee8cb02d5251bc /lib | |
parent | 7797e8f9019d304e394a6ad3bf72a200473d0747 (diff) | |
download | external_llvm-80acd97266f6f165285ae9303dea9654f87a2a87.zip external_llvm-80acd97266f6f165285ae9303dea9654f87a2a87.tar.gz external_llvm-80acd97266f6f165285ae9303dea9654f87a2a87.tar.bz2 |
[code size][ARM] Emit regular call instructions instead of the move, branch sequence
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@166854 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Target/ARM/ARMISelLowering.cpp | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/lib/Target/ARM/ARMISelLowering.cpp b/lib/Target/ARM/ARMISelLowering.cpp index 8de2387..e4bc31c 100644 --- a/lib/Target/ARM/ARMISelLowering.cpp +++ b/lib/Target/ARM/ARMISelLowering.cpp @@ -1594,11 +1594,15 @@ ARMTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI, // FIXME: handle tail calls differently. unsigned CallOpc; + bool HasForceSizeAttr = MF.getFunction()->getFnAttributes(). + hasAttribute(Attributes::ForceSizeOpt); if (Subtarget->isThumb()) { if ((!isDirect || isARMFunc) && !Subtarget->hasV5TOps()) CallOpc = ARMISD::CALL_NOLINK; else if (doesNotRet && isDirect && !isARMFunc && - Subtarget->hasRAS() && !Subtarget->isThumb1Only()) + Subtarget->hasRAS() && !Subtarget->isThumb1Only() && + // Emit regular call when code size is the priority + !HasForceSizeAttr) // "mov lr, pc; b _foo" to avoid confusing the RSP CallOpc = ARMISD::CALL_NOLINK; else @@ -1606,7 +1610,9 @@ ARMTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI, } else { if (!isDirect && !Subtarget->hasV5TOps()) { CallOpc = ARMISD::CALL_NOLINK; - } else if (doesNotRet && isDirect && Subtarget->hasRAS()) + } else if (doesNotRet && isDirect && Subtarget->hasRAS() && + // Emit regular call when code size is the priority + !HasForceSizeAttr) // "mov lr, pc; b _foo" to avoid confusing the RSP CallOpc = ARMISD::CALL_NOLINK; else |