]> granicus.if.org Git - llvm/commitdiff
[AArch64] Preserve X8 for thunks ending in variadic musttail calls
authorReid Kleckner <rnk@google.com>
Fri, 24 May 2019 01:27:20 +0000 (01:27 +0000)
committerReid Kleckner <rnk@google.com>
Fri, 24 May 2019 01:27:20 +0000 (01:27 +0000)
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

lib/Target/AArch64/AArch64ISelLowering.cpp
test/CodeGen/AArch64/vararg-tallcall.ll

index 4b027e9363346244bdb1827655c9cfe20999ae02..ac656959bcbaa0b9ab36fd4e2bc723e2e6d1be83 100644 (file)
@@ -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));
+      }
     }
   }
 
index 2818222680335e9424be967f63028b76e76d994f..56c56213af3542f1b194574558ad61c0e2e5b562 100644 (file)
@@ -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