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

Arnold Schwaighofer via llvm-commits llvm-commits at lists.llvm.org
Wed Feb 15 07:44:41 PST 2017


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



More information about the llvm-commits mailing list