[llvm] r215600 - [AArch64, fast-isel] Fall back to SelectionDAG to select tail calls.
Chad Rosier
mcrosier at codeaurora.org
Wed Aug 13 18:03:48 PDT 2014
Seems musttail was landed back in April, but the Phabricator revision was
never closed. Sounds like a good solution, but again no rush.
> Akira,
> Has the musttail attribute landed? Looks like Reid was working on
> something (http://reviews.llvm.org/D3240), but I haven't been following
> the patch. I have no real urgency in seeing this enhancement, so
> prioritize this as you see fit.
>
> Chad
>
>
>
>> Hi Chad,
>>
>> Ill see if its 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
>>>
>>
>>
>
>
> --
> Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
> hosted by The Linux Foundation
>
>
--
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
hosted by The Linux Foundation
More information about the llvm-commits
mailing list