summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
authorReid Kleckner <rnk@google.com>2019-05-24 01:27:20 +0000
committerReid Kleckner <rnk@google.com>2019-05-24 01:27:20 +0000
commitb7a78c7dff18485e5ac85aa8c902571da4b06a33 (patch)
tree3ac414250e2a3bbd2cb3913f45198b3030d1868a /llvm
parented595e8627b37131d1f0146c24655a1825c5cf13 (diff)
downloadbcm5719-llvm-b7a78c7dff18485e5ac85aa8c902571da4b06a33.tar.gz
bcm5719-llvm-b7a78c7dff18485e5ac85aa8c902571da4b06a33.zip
[AArch64] Preserve X8 for thunks ending in variadic musttail calls
Summary: On Windows, X8 may be used to pass in the address of an aggregate that is returned indirectly. Therefore, it should be forwarded to variadic musttail calls and preserved in thunks. Fixes PR41997 Reviewers: mgrang, efriedma Subscribers: javed.absar, kristof.beyls, hiraditya, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D62344 llvm-svn: 361585
Diffstat (limited to 'llvm')
-rw-r--r--llvm/lib/Target/AArch64/AArch64ISelLowering.cpp6
-rw-r--r--llvm/test/CodeGen/AArch64/vararg-tallcall.ll6
2 files changed, 9 insertions, 3 deletions
diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
index 4b027e93633..ac656959bcb 100644
--- a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
+++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
@@ -3207,6 +3207,12 @@ SDValue AArch64TargetLowering::LowerFormalArguments(
FuncInfo->getForwardedMustTailRegParms();
CCInfo.analyzeMustTailForwardedRegisters(Forwards, RegParmTypes,
CC_AArch64_AAPCS);
+
+ // Conservatively forward X8, since it might be used for aggregate return.
+ if (!CCInfo.isAllocated(AArch64::X8)) {
+ unsigned X8VReg = MF.addLiveIn(AArch64::X8, &AArch64::GPR64RegClass);
+ Forwards.push_back(ForwardedRegister(X8VReg, AArch64::X8, MVT::i64));
+ }
}
}
diff --git a/llvm/test/CodeGen/AArch64/vararg-tallcall.ll b/llvm/test/CodeGen/AArch64/vararg-tallcall.ll
index 28182226803..56c56213af3 100644
--- a/llvm/test/CodeGen/AArch64/vararg-tallcall.ll
+++ b/llvm/test/CodeGen/AArch64/vararg-tallcall.ll
@@ -28,7 +28,7 @@ entry:
attributes #1 = { noinline optnone "thunk" }
; CHECK: mov v16.16b, v0.16b
-; CHECK: ldr x8, [x0]
-; CHECK: ldr x8, [x8]
+; CHECK: ldr x9, [x0]
+; CHECK: ldr x9, [x9]
; CHECK: mov v0.16b, v16.16b
-; CHECK: br x8
+; CHECK: br x9
OpenPOWER on IntegriCloud