[llvm] r215600 - [AArch64, fast-isel] Fall back to SelectionDAG to select tail calls.

Chad Rosier mcrosier at codeaurora.org
Wed Aug 13 18:00:25 PDT 2014


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,
>
> 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
>>
>
>


-- 
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
hosted by The Linux Foundation




More information about the llvm-commits mailing list