mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 03:02:36 +01:00
[AArch64, fast-isel] Fall back to SelectionDAG to select tail calls.
Certain functions such as objc_autoreleaseReturnValue have to be called as tail-calls even at -O0. Since normal fast-isel doesn't emit calls as tail calls, we have to fall back to SelectionDAG to select calls that are marked as tail. <rdar://problem/17991614> llvm-svn: 215600
This commit is contained in:
parent
1428168ab7
commit
87c53cc314
@ -1687,10 +1687,15 @@ bool AArch64FastISel::FinishCall(CallLoweringInfo &CLI, MVT RetVT,
|
||||
|
||||
bool AArch64FastISel::FastLowerCall(CallLoweringInfo &CLI) {
|
||||
CallingConv::ID CC = CLI.CallConv;
|
||||
bool IsTailCall = CLI.IsTailCall;
|
||||
bool IsVarArg = CLI.IsVarArg;
|
||||
const Value *Callee = CLI.Callee;
|
||||
const char *SymName = CLI.SymName;
|
||||
|
||||
// Allow SelectionDAG isel to handle tail calls.
|
||||
if (IsTailCall)
|
||||
return false;
|
||||
|
||||
CodeModel::Model CM = TM.getCodeModel();
|
||||
// Only support the small and large code model.
|
||||
if (CM != CodeModel::Small && CM != CodeModel::Large)
|
||||
|
@ -511,7 +511,9 @@ entry:
|
||||
; CHECK: str {{w[0-9]+}}, [sp]
|
||||
; FAST-LABEL: i64_split
|
||||
; FAST: ldr x7, [{{x[0-9]+}}]
|
||||
; FAST: str {{w[0-9]+}}, [sp]
|
||||
; FAST: mov x[[R0:[0-9]+]], sp
|
||||
; FAST: orr w[[R1:[0-9]+]], wzr, #0x8
|
||||
; FAST: str w[[R1]], {{\[}}x[[R0]]{{\]}}
|
||||
%0 = load i64* bitcast (%struct.s41* @g41 to i64*), align 16
|
||||
%call = tail call i32 @callee_i64(i32 1, i32 2, i32 3, i32 4, i32 5,
|
||||
i32 6, i32 7, i64 %0, i32 8) #5
|
||||
|
11
test/CodeGen/AArch64/tailcall-fastisel.ll
Normal file
11
test/CodeGen/AArch64/tailcall-fastisel.ll
Normal file
@ -0,0 +1,11 @@
|
||||
; RUN: llc < %s -mtriple=arm64-apple-darwin -O0 | FileCheck %s
|
||||
|
||||
; CHECK: b _foo0
|
||||
|
||||
define i32 @foo1() {
|
||||
entry:
|
||||
%call = tail call i32 @foo0()
|
||||
ret i32 %call
|
||||
}
|
||||
|
||||
declare i32 @foo0()
|
Loading…
Reference in New Issue
Block a user