From 965cce15e7e6461d43cd796e5f121783f63da718 Mon Sep 17 00:00:00 2001 From: Jessica Paquette Date: Wed, 11 Sep 2019 23:44:16 +0000 Subject: [PATCH] [GlobalISel][AArch64] Check caller for swifterror params in tailcall eligibility Before, we only checked the callee for swifterror. However, we should also be checking the caller to see if it has a swifterror parameter. Since we don't currently handle outgoing arguments, this didn't show up in the swifterror.ll testcase. Also, remove the swifterror checks from call-translator-tail-call.ll, since they are covered by the existing swifterror testing. Better to have it all in one place. Differential Revision: https://reviews.llvm.org/D67465 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@371692 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/AArch64/AArch64CallLowering.cpp | 10 +++-- .../GlobalISel/call-translator-tail-call.ll | 44 ------------------- test/CodeGen/AArch64/GlobalISel/swifterror.ll | 9 ++++ 3 files changed, 16 insertions(+), 47 deletions(-) diff --git a/lib/Target/AArch64/AArch64CallLowering.cpp b/lib/Target/AArch64/AArch64CallLowering.cpp index 77944186c45..1ca89ba33a5 100644 --- a/lib/Target/AArch64/AArch64CallLowering.cpp +++ b/lib/Target/AArch64/AArch64CallLowering.cpp @@ -493,11 +493,15 @@ bool AArch64CallLowering::isEligibleForTailCallOptimization( // caller has an argument with "inreg" attribute. // // FIXME: Check whether the callee also has an "inreg" argument. + // + // When the caller has a swifterror argument, we don't want to tail call + // because would have to move into the swifterror register before the + // tail call. if (any_of(CallerF.args(), [](const Argument &A) { - return A.hasByValAttr() || A.hasInRegAttr(); + return A.hasByValAttr() || A.hasInRegAttr() || A.hasSwiftErrorAttr(); })) { - LLVM_DEBUG(dbgs() << "... Cannot tail call from callers with byval or " - "inreg arguments.\n"); + LLVM_DEBUG(dbgs() << "... Cannot tail call from callers with byval, " + "inreg, or swifterror arguments\n"); return false; } diff --git a/test/CodeGen/AArch64/GlobalISel/call-translator-tail-call.ll b/test/CodeGen/AArch64/GlobalISel/call-translator-tail-call.ll index c9ace6f4de1..54a008bf8fd 100644 --- a/test/CodeGen/AArch64/GlobalISel/call-translator-tail-call.ll +++ b/test/CodeGen/AArch64/GlobalISel/call-translator-tail-call.ll @@ -52,50 +52,6 @@ define i32 @test_nonvoid_ret() { ret i32 %call } -; Don't want to handle swifterror at all right now, since lowerCall will -; insert a COPY after the call right now. -; TODO: Support this. -%swift_error = type {i64, i8} -define float @swifterror(%swift_error** swifterror %ptr) { - ; COMMON-LABEL: name: swifterror - ; COMMON: bb.1 (%ir-block.0): - ; COMMON: liveins: $x21 - ; COMMON: [[COPY:%[0-9]+]]:_(p0) = COPY $x21 - ; COMMON: [[COPY1:%[0-9]+]]:gpr64all = COPY [[COPY]](p0) - ; COMMON: [[COPY2:%[0-9]+]]:_(p0) = COPY [[COPY1]] - ; COMMON: ADJCALLSTACKDOWN 0, 0, implicit-def $sp, implicit $sp - ; COMMON: $x21 = COPY [[COPY2]](p0) - ; COMMON: BL @swifterror, csr_aarch64_aapcs_swifterror, implicit-def $lr, implicit $sp, implicit $x21, implicit-def $s0, implicit-def $x21 - ; COMMON: [[COPY3:%[0-9]+]]:_(s32) = COPY $s0 - ; COMMON: [[COPY4:%[0-9]+]]:gpr64all = COPY $x21 - ; COMMON: ADJCALLSTACKUP 0, 0, implicit-def $sp, implicit $sp - ; COMMON: $s0 = COPY [[COPY3]](s32) - ; COMMON: $x21 = COPY [[COPY4]] - ; COMMON: RET_ReallyLR implicit $s0, implicit $x21 - %call = tail call float @swifterror(%swift_error** swifterror %ptr) - ret float %call -} - -define swiftcc float @swifterror_swiftcc(%swift_error** swifterror %ptr) { - ; COMMON-LABEL: name: swifterror_swiftcc - ; COMMON: bb.1 (%ir-block.0): - ; COMMON: liveins: $x21 - ; COMMON: [[COPY:%[0-9]+]]:_(p0) = COPY $x21 - ; COMMON: [[COPY1:%[0-9]+]]:gpr64all = COPY [[COPY]](p0) - ; COMMON: [[COPY2:%[0-9]+]]:_(p0) = COPY [[COPY1]] - ; COMMON: ADJCALLSTACKDOWN 0, 0, implicit-def $sp, implicit $sp - ; COMMON: $x21 = COPY [[COPY2]](p0) - ; COMMON: BL @swifterror_swiftcc, csr_aarch64_aapcs_swifterror, implicit-def $lr, implicit $sp, implicit $x21, implicit-def $s0, implicit-def $x21 - ; COMMON: [[COPY3:%[0-9]+]]:_(s32) = COPY $s0 - ; COMMON: [[COPY4:%[0-9]+]]:gpr64all = COPY $x21 - ; COMMON: ADJCALLSTACKUP 0, 0, implicit-def $sp, implicit $sp - ; COMMON: $s0 = COPY [[COPY3]](s32) - ; COMMON: $x21 = COPY [[COPY4]] - ; COMMON: RET_ReallyLR implicit $s0, implicit $x21 - %call = tail call swiftcc float @swifterror_swiftcc(%swift_error** swifterror %ptr) - ret float %call -} - ; Right now, this should not be tail called. ; TODO: Support this. declare void @varargs(i32, double, i64, ...) diff --git a/test/CodeGen/AArch64/GlobalISel/swifterror.ll b/test/CodeGen/AArch64/GlobalISel/swifterror.ll index 8e0c287725a..329828f5e93 100644 --- a/test/CodeGen/AArch64/GlobalISel/swifterror.ll +++ b/test/CodeGen/AArch64/GlobalISel/swifterror.ll @@ -487,6 +487,15 @@ entry: ret void } +; CHECK: tailcall_from_swifterror2 +; CHECK-NOT: b _simple_fn +; CHECK: bl _simple_fn +declare void @simple_fn() +define swiftcc void @tailcall_from_swifterror2(%swift_error** swifterror %error_ptr_ref) { + tail call void @simple_fn() + ret void +} + declare swiftcc void @foo2(%swift_error** swifterror) ; CHECK-LABEL: testAssign ; CHECK: mov x21, xzr -- 2.40.0