[llvm] r215600 - [AArch64, fast-isel] Fall back to SelectionDAG to select tail calls.
Akira Hatanaka
ahatanaka at apple.com
Wed Aug 13 17:01:33 PDT 2014
Hi Chad,
I’ll see if it’s possible to narrow the scope. We might be able to mark the functions that require special handling as “musttail” instead of “tail” and return false in FastISel::SelectInstruction upon seeing those functions.
> On Aug 13, 2014, at 4:55 PM, Chad Rosier <mcrosier at codeaurora.org> wrote:
>
> Hi Akira,
> Would it be possible to narrow the scope to only those tail calls that
> require special handling? Or is it that the front-end will only emit tail
> calls for those calls that require it at -O0? Please clarify.
>
> Chad
>
>> Author: ahatanak
>> Date: Wed Aug 13 18:23:58 2014
>> New Revision: 215600
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=215600&view=rev
>> Log:
>> [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>
>>
>>
>> Added:
>> llvm/trunk/test/CodeGen/AArch64/tailcall-fastisel.ll
>> Modified:
>> llvm/trunk/lib/Target/AArch64/AArch64FastISel.cpp
>> llvm/trunk/test/CodeGen/AArch64/arm64-abi_align.ll
>>
>> Modified: llvm/trunk/lib/Target/AArch64/AArch64FastISel.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AArch64/AArch64FastISel.cpp?rev=215600&r1=215599&r2=215600&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Target/AArch64/AArch64FastISel.cpp (original)
>> +++ llvm/trunk/lib/Target/AArch64/AArch64FastISel.cpp Wed Aug 13 18:23:58
>> 2014
>> @@ -1687,10 +1687,15 @@ bool AArch64FastISel::FinishCall(CallLow
>>
>> 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)
>>
>> Modified: llvm/trunk/test/CodeGen/AArch64/arm64-abi_align.ll
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AArch64/arm64-abi_align.ll?rev=215600&r1=215599&r2=215600&view=diff
>> ==============================================================================
>> --- llvm/trunk/test/CodeGen/AArch64/arm64-abi_align.ll (original)
>> +++ llvm/trunk/test/CodeGen/AArch64/arm64-abi_align.ll Wed Aug 13 18:23:58
>> 2014
>> @@ -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
>>
>> Added: llvm/trunk/test/CodeGen/AArch64/tailcall-fastisel.ll
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AArch64/tailcall-fastisel.ll?rev=215600&view=auto
>> ==============================================================================
>> --- llvm/trunk/test/CodeGen/AArch64/tailcall-fastisel.ll (added)
>> +++ llvm/trunk/test/CodeGen/AArch64/tailcall-fastisel.ll Wed Aug 13
>> 18:23:58 2014
>> @@ -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()
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>
>
>
> --
> Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
> hosted by The Linux Foundation
>
More information about the llvm-commits
mailing list