[4.0 merge request] Re: [llvm] r294982 - swiftcc: Don't emit tail calls from callers with swifterror parameters

Hans Wennborg via llvm-commits llvm-commits at lists.llvm.org
Wed Feb 15 11:24:21 PST 2017


r295219.

On Wed, Feb 15, 2017 at 10:48 AM, Justin Bogner <jbogner at apple.com> wrote:
> LGTM
>
>> On Feb 15, 2017, at 10:45, Hans Wennborg <hans at chromium.org> wrote:
>>
>> Sounds good to me if Justin agrees.
>>
>> On Wed, Feb 15, 2017 at 7:44 AM, Arnold Schwaighofer via llvm-commits
>> <llvm-commits at lists.llvm.org> wrote:
>>> Hi Hans, Justin,
>>>
>>> Can we merge this into the 4.0 branch?
>>>
>>> Again this is a change that only affects the swift calling convention.
>>>
>>> Thanks!
>>>
>>>
>>>> On Feb 13, 2017, at 11:58 AM, Arnold Schwaighofer via llvm-commits <llvm-commits at lists.llvm.org> wrote:
>>>>
>>>> Author: arnolds
>>>> Date: Mon Feb 13 13:58:28 2017
>>>> New Revision: 294982
>>>>
>>>> URL: http://llvm.org/viewvc/llvm-project?rev=294982&view=rev
>>>> Log:
>>>> swiftcc: Don't emit tail calls from callers with swifterror parameters
>>>>
>>>> Backends don't support this yet. They would have to move to the swifterror
>>>> register before the tail call to make sure it is live-in to the call.
>>>>
>>>> rdar://30495920
>>>>
>>>> Modified:
>>>>   llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
>>>>   llvm/trunk/test/CodeGen/AArch64/swifterror.ll
>>>>   llvm/trunk/test/CodeGen/ARM/swifterror.ll
>>>>   llvm/trunk/test/CodeGen/X86/swifterror.ll
>>>>
>>>> Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
>>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp?rev=294982&r1=294981&r2=294982&view=diff
>>>> ==============================================================================
>>>> --- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp (original)
>>>> +++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp Mon Feb 13 13:58:28 2017
>>>> @@ -5916,6 +5916,15 @@ void SelectionDAGBuilder::LowerCallTo(Im
>>>>
>>>>  const Value *SwiftErrorVal = nullptr;
>>>>  const TargetLowering &TLI = DAG.getTargetLoweringInfo();
>>>> +
>>>> +  // We can't tail call inside a function with a swifterror argument. Lowering
>>>> +  // does not support this yet. It would have to move into the swifterror
>>>> +  // register before the call.
>>>> +  auto *Caller = CS.getInstruction()->getParent()->getParent();
>>>> +  if (TLI.supportSwiftError() &&
>>>> +      Caller->getAttributes().hasAttrSomewhere(Attribute::SwiftError))
>>>> +    isTailCall = false;
>>>> +
>>>>  for (ImmutableCallSite::arg_iterator i = CS.arg_begin(), e = CS.arg_end();
>>>>       i != e; ++i) {
>>>>    const Value *V = *i;
>>>>
>>>> Modified: llvm/trunk/test/CodeGen/AArch64/swifterror.ll
>>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AArch64/swifterror.ll?rev=294982&r1=294981&r2=294982&view=diff
>>>> ==============================================================================
>>>> --- llvm/trunk/test/CodeGen/AArch64/swifterror.ll (original)
>>>> +++ llvm/trunk/test/CodeGen/AArch64/swifterror.ll Mon Feb 13 13:58:28 2017
>>>> @@ -583,3 +583,17 @@ define swiftcc { i64, i64, i64, i64, i64
>>>> }
>>>>
>>>> declare swiftcc { i64, i64, i64, i64, i64, i64, i64, i64 } @params_and_return_in_reg2(i64, i64, i64, i64, i64, i64, i64, i64, i8* swiftself, %swift_error** nocapture swifterror %err)
>>>> +
>>>> +declare void @acallee(i8*)
>>>> +
>>>> +; Make sure we don't tail call if the caller returns a swifterror value. We
>>>> +; would have to move into the swifterror register before the tail call.
>>>> +; CHECK-APPLE: tailcall_from_swifterror:
>>>> +; CHECK-APPLE-NOT: b _acallee
>>>> +; CHECK-APPLE: bl _acallee
>>>> +
>>>> +define swiftcc void @tailcall_from_swifterror(%swift_error** swifterror %error_ptr_ref) {
>>>> +entry:
>>>> +  tail call void @acallee(i8* null)
>>>> +  ret void
>>>> +}
>>>>
>>>> Modified: llvm/trunk/test/CodeGen/ARM/swifterror.ll
>>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/swifterror.ll?rev=294982&r1=294981&r2=294982&view=diff
>>>> ==============================================================================
>>>> --- llvm/trunk/test/CodeGen/ARM/swifterror.ll (original)
>>>> +++ llvm/trunk/test/CodeGen/ARM/swifterror.ll Mon Feb 13 13:58:28 2017
>>>> @@ -513,3 +513,18 @@ define swiftcc { i32, i32, i32, i32} @pa
>>>> }
>>>>
>>>> declare swiftcc { i32, i32, i32, i32 } @params_and_return_in_reg2(i32, i32, i32, i32, i8* swiftself, %swift_error** nocapture swifterror %err)
>>>> +
>>>> +
>>>> +declare void @acallee(i8*)
>>>> +
>>>> +; Make sure we don't tail call if the caller returns a swifterror value. We
>>>> +; would have to move into the swifterror register before the tail call.
>>>> +; CHECK-APPLE: tailcall_from_swifterror:
>>>> +; CHECK-APPLE-NOT: b _acallee
>>>> +; CHECK-APPLE: bl _acallee
>>>> +
>>>> +define swiftcc void @tailcall_from_swifterror(%swift_error** swifterror %error_ptr_ref) {
>>>> +entry:
>>>> +  tail call void @acallee(i8* null)
>>>> +  ret void
>>>> +}
>>>>
>>>> Modified: llvm/trunk/test/CodeGen/X86/swifterror.ll
>>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/swifterror.ll?rev=294982&r1=294981&r2=294982&view=diff
>>>> ==============================================================================
>>>> --- llvm/trunk/test/CodeGen/X86/swifterror.ll (original)
>>>> +++ llvm/trunk/test/CodeGen/X86/swifterror.ll Mon Feb 13 13:58:28 2017
>>>> @@ -670,3 +670,18 @@ define swiftcc { i64, i64, i64, i64} @pa
>>>> }
>>>>
>>>> declare swiftcc { i64, i64, i64, i64 } @params_and_return_in_reg2(i64, i64, i64, i64, i64, i64, i8* swiftself, %swift_error** nocapture swifterror %err)
>>>> +
>>>> +
>>>> +declare void @acallee(i8*)
>>>> +
>>>> +; Make sure we don't tail call if the caller returns a swifterror value. We
>>>> +; would have to move into the swifterror register before the tail call.
>>>> +; CHECK-APPLE: tailcall_from_swifterror:
>>>> +; CHECK-APPLE-NOT: jmp _acallee
>>>> +; CHECK-APPLE: callq _acallee
>>>> +
>>>> +define swiftcc void @tailcall_from_swifterror(%swift_error** swifterror %error_ptr_ref) {
>>>> +entry:
>>>> +  tail call void @acallee(i8* null)
>>>> +  ret void
>>>> +}
>>>>
>>>>
>>>> _______________________________________________
>>>> llvm-commits mailing list
>>>> llvm-commits at lists.llvm.org
>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>>
>>> _______________________________________________
>>> llvm-commits mailing list
>>> llvm-commits at lists.llvm.org
>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits


More information about the llvm-commits mailing list