[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