[4.0 merge request] Re: [llvm] r294982 - swiftcc: Don't emit tail calls from callers with swifterror parameters
Justin Bogner via llvm-commits
llvm-commits at lists.llvm.org
Wed Feb 15 10:48:40 PST 2017
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