-
Notifications
You must be signed in to change notification settings - Fork 15.1k
AArch64: correct preserve_most and preserve_all on Windows
#166436
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
|
@llvm/pr-subscribers-platform-windows @llvm/pr-subscribers-backend-aarch64 Author: Saleem Abdulrasool (compnerd) ChangesThis fixes register information handling for the The root issue was cascading Full diff: https://github.com/llvm/llvm-project/pull/166436.diff 3 Files Affected:
diff --git a/llvm/lib/Target/AArch64/AArch64CallingConvention.td b/llvm/lib/Target/AArch64/AArch64CallingConvention.td
index 1b5a713bffdc9..34c85d588f9c4 100644
--- a/llvm/lib/Target/AArch64/AArch64CallingConvention.td
+++ b/llvm/lib/Target/AArch64/AArch64CallingConvention.td
@@ -601,6 +601,12 @@ def CSR_Win_AArch64_AAPCS_SwiftError
def CSR_Win_AArch64_AAPCS_SwiftTail
: CalleeSavedRegs<(sub CSR_Win_AArch64_AAPCS, X20, X22)>;
+def CSR_Win_AArch64_RT_MostRegs
+ : CalleeSavedRegs<(add CSR_Win_AArch64_AAPCS, (sequence "X%u", 9, 15))>;
+
+def CSR_Win_AArch64_RT_AllRegs
+ : CalleeSavedRegs<(add CSR_Win_AArch64_RT_MostRegs, (sequence "Q%u", 8, 31))>;
+
// The Control Flow Guard check call uses a custom calling convention that also
// preserves X0-X8 and Q0-Q7.
def CSR_Win_AArch64_CFGuard_Check : CalleeSavedRegs<(add CSR_Win_AArch64_AAPCS,
diff --git a/llvm/lib/Target/AArch64/AArch64RegisterInfo.cpp b/llvm/lib/Target/AArch64/AArch64RegisterInfo.cpp
index 5bfb19d9a7e61..061702ac11eb2 100644
--- a/llvm/lib/Target/AArch64/AArch64RegisterInfo.cpp
+++ b/llvm/lib/Target/AArch64/AArch64RegisterInfo.cpp
@@ -90,6 +90,16 @@ AArch64RegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const {
if (MF->getSubtarget<AArch64Subtarget>().isTargetDarwin())
return getDarwinCalleeSavedRegs(MF);
+ if (MF->getFunction().getCallingConv() == CallingConv::PreserveMost)
+ return MF->getSubtarget<AArch64Subtarget>().isTargetWindows()
+ ? CSR_Win_AArch64_RT_MostRegs_SaveList
+ : CSR_AArch64_RT_MostRegs_SaveList;
+
+ if (MF->getFunction().getCallingConv() == CallingConv::PreserveAll)
+ return MF->getSubtarget<AArch64Subtarget>().isTargetWindows()
+ ? CSR_Win_AArch64_RT_AllRegs_SaveList
+ : CSR_AArch64_RT_AllRegs_SaveList;
+
if (MF->getFunction().getCallingConv() == CallingConv::CFGuard_Check)
return CSR_Win_AArch64_CFGuard_Check_SaveList;
if (MF->getSubtarget<AArch64Subtarget>().isTargetWindows()) {
@@ -138,10 +148,6 @@ AArch64RegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const {
return CSR_AArch64_AAPCS_SwiftError_SaveList;
if (MF->getFunction().getCallingConv() == CallingConv::SwiftTail)
return CSR_AArch64_AAPCS_SwiftTail_SaveList;
- if (MF->getFunction().getCallingConv() == CallingConv::PreserveMost)
- return CSR_AArch64_RT_MostRegs_SaveList;
- if (MF->getFunction().getCallingConv() == CallingConv::PreserveAll)
- return CSR_AArch64_RT_AllRegs_SaveList;
if (MF->getFunction().getCallingConv() == CallingConv::Win64)
// This is for OSes other than Windows; Windows is a separate case further
// above.
diff --git a/llvm/test/CodeGen/AArch64/preserve_mostcc.ll b/llvm/test/CodeGen/AArch64/preserve_mostcc.ll
index 7f0968c8eb339..75c8567e2095e 100644
--- a/llvm/test/CodeGen/AArch64/preserve_mostcc.ll
+++ b/llvm/test/CodeGen/AArch64/preserve_mostcc.ll
@@ -1,4 +1,5 @@
-; RUN: llc < %s -mtriple=arm64-apple-ios-8.0.0 | FileCheck %s
+; RUN: llc < %s -mtriple=arm64-apple-ios-8.0.0 | FileCheck -check-prefix CHECK -check-prefix CHECK-DARWIN %s
+; RUN: llc < %s -mtriple=aarch64-unknown-windiws-msvc | FileCheck -check-prefix CHECK -check-prefix CHECK-WIN %s
declare void @standard_cc_func()
declare preserve_mostcc void @preserve_mostcc_func()
@@ -8,18 +9,26 @@ declare preserve_mostcc void @preserve_mostcc_func()
define preserve_mostcc void @preserve_mostcc1() nounwind {
entry:
;CHECK-LABEL: preserve_mostcc1
-;CHECK-NOT: stp
-;CHECK-NOT: str
-;CHECK: str x15
-;CHECK-NEXT: stp x14, x13,
-;CHECK-NEXT: stp x12, x11,
-;CHECK-NEXT: stp x10, x9,
-;CHECK: bl _standard_cc_func
+;CHECK-DARWIN-NOT: stp
+;CHECK-DARWIN-NOT: str
+;CHECK-DARWIN: str x15
+;CHECK-DARWIN-NEXT: stp x14, x13,
+;CHECK-DARWIN-NEXT: stp x12, x11,
+;CHECK-DARWIN-NEXT: stp x10, x9,
+;CHECK-WIN: stp x15, x14
+;CHECK-WIN-NEXT: stp x13, x12,
+;CHECK-WIN-NEXT: stp x11, x10,
+;CHECK-WIN-NEXT: stp x9, x30
+;CHECK: bl {{_?}}standard_cc_func
call void @standard_cc_func()
-;CHECK: ldp x10, x9,
-;CHECK-NEXT: ldp x12, x11,
-;CHECK-NEXT: ldp x14, x13,
-;CHECK-NEXT: ldr x15
+;CHECK-DARWIN: ldp x10, x9,
+;CHECK-DARWIN-NEXT: ldp x12, x11,
+;CHECK-DARWIN-NEXT: ldp x14, x13,
+;CHECK-DARWIN-NEXT: ldr x15
+;CHECK-WIN: ldp x9, x30
+;CHECK-WIN-NEXT: ldp x11, x10,
+;CHECK-WIN-NEXT: ldp x13, x12,
+;CHECK-WIN-NEXT: ldp x15, x14,
ret void
}
@@ -31,9 +40,10 @@ define preserve_mostcc void @preserve_mostcc2() nounwind {
entry:
;CHECK-LABEL: preserve_mostcc2
;CHECK-NOT: x14
-;CHECK: stp x29, x30,
+;CHECK-DARWIN: stp x29, x30,
+;CHECK-WIN: str x30
;CHECK-NOT: x14
-;CHECK: bl _preserve_mostcc_func
+;CHECK: bl {{_?}}preserve_mostcc_func
call preserve_mostcc void @preserve_mostcc_func()
ret void
}
|
|
✅ With the latest revision this PR passed the C/C++ code formatter. |
This fixes register information handling for the `preserve_most` and `preserve_all` calling conventions on Windows ARM64. The root issue was cascading `if` statements whose behavior depended on their order. This patch makes the minimal, tactical change needed for Swift’s two calling conventions, unblocking current work. A broader refactor to remove the ordering dependency is still desired and will follow in a subsequent PR.
ad0b562 to
7122afa
Compare
This fixes register information handling for the
preserve_mostandpreserve_allcalling conventions on Windows ARM64.The root issue was cascading
ifstatements whose behavior depended on their order. This patch makes the minimal, tactical change needed for Swift’s two calling conventions, unblocking current work. A broader refactor to remove the ordering dependency is still desired and will follow in a subsequent PR.