mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-04-07 01:38:26 +00:00
[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
This commit is contained in:
parent
7797e8f901
commit
80acd97266
@ -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
|
||||
|
34
test/CodeGen/ARM/call-noret-forsize.ll
Normal file
34
test/CodeGen/ARM/call-noret-forsize.ll
Normal file
@ -0,0 +1,34 @@
|
||||
; RUN: llc < %s -mtriple=armv7-apple-ios -mcpu=cortex-a8 | FileCheck %s -check-prefix=ARM
|
||||
; RUN: llc < %s -mtriple=armv7-apple-ios -mcpu=swift | FileCheck %s -check-prefix=SWIFT
|
||||
; RUN: llc < %s -mtriple=thumbv7-apple-ios -mcpu=cortex-a8 | FileCheck %s -check-prefix=T2
|
||||
; rdar://12348580
|
||||
|
||||
define void @t1() noreturn forcesizeopt nounwind ssp {
|
||||
entry:
|
||||
; ARM: t1:
|
||||
; ARM: bl _bar
|
||||
|
||||
; SWIFT: t1:
|
||||
; SWIFT: bl _bar
|
||||
|
||||
; T2: t1:
|
||||
; T2: blx _bar
|
||||
tail call void @bar() noreturn nounwind
|
||||
unreachable
|
||||
}
|
||||
|
||||
define void @t2() noreturn forcesizeopt nounwind ssp {
|
||||
entry:
|
||||
; ARM: t2:
|
||||
; ARM: bl _t1
|
||||
|
||||
; SWIFT: t2:
|
||||
; SWIFT: bl _t1
|
||||
|
||||
; T2: t2:
|
||||
; T2: bl _t1
|
||||
tail call void @t1() noreturn nounwind
|
||||
unreachable
|
||||
}
|
||||
|
||||
declare void @bar() noreturn
|
Loading…
x
Reference in New Issue
Block a user