[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