From: Reid Kleckner Date: Fri, 24 May 2019 01:27:20 +0000 (+0000) Subject: [AArch64] Preserve X8 for thunks ending in variadic musttail calls X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=85ea819c593705b0694f8749eba9f41e7866cca5;p=llvm [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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@361585 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/AArch64/AArch64ISelLowering.cpp b/lib/Target/AArch64/AArch64ISelLowering.cpp index 4b027e93633..ac656959bcb 100644 --- a/lib/Target/AArch64/AArch64ISelLowering.cpp +++ b/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/test/CodeGen/AArch64/vararg-tallcall.ll b/test/CodeGen/AArch64/vararg-tallcall.ll index 28182226803..56c56213af3 100644 --- a/test/CodeGen/AArch64/vararg-tallcall.ll +++ b/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