[llvm] [AArch64] Fix register reversing crash on MSVC with 1 pair. (PR #82392)
Scott Todd via llvm-commits
llvm-commits at lists.llvm.org
Tue Feb 20 10:02:29 PST 2024
https://github.com/ScottTodd updated https://github.com/llvm/llvm-project/pull/82392
>From 528a30454f8d2e25b44ee3641ed5c70d13b0b9ba Mon Sep 17 00:00:00 2001
From: Scott Todd <scott.todd0 at gmail.com>
Date: Tue, 20 Feb 2024 09:49:43 -0800
Subject: [PATCH 1/3] [AArch64] Fix register reversing crash on MSVC with 1
pair.
---
.../Target/AArch64/AArch64FrameLowering.cpp | 18 ++++++++++--------
1 file changed, 10 insertions(+), 8 deletions(-)
diff --git a/llvm/lib/Target/AArch64/AArch64FrameLowering.cpp b/llvm/lib/Target/AArch64/AArch64FrameLowering.cpp
index c013bbe9926fef..6c8117cb978df5 100644
--- a/llvm/lib/Target/AArch64/AArch64FrameLowering.cpp
+++ b/llvm/lib/Target/AArch64/AArch64FrameLowering.cpp
@@ -3115,14 +3115,16 @@ bool AArch64FrameLowering::restoreCalleeSavedRegisters(
}
// For performance reasons restore SVE register in increasing order
- auto IsPPR = [](const RegPairInfo &c) { return c.Type == RegPairInfo::PPR; };
- auto PPRBegin = std::find_if(RegPairs.begin(), RegPairs.end(), IsPPR);
- auto PPREnd = std::find_if(RegPairs.rbegin(), RegPairs.rend(), IsPPR);
- std::reverse(PPRBegin, PPREnd.base());
- auto IsZPR = [](const RegPairInfo &c) { return c.Type == RegPairInfo::ZPR; };
- auto ZPRBegin = std::find_if(RegPairs.begin(), RegPairs.end(), IsZPR);
- auto ZPREnd = std::find_if(RegPairs.rbegin(), RegPairs.rend(), IsZPR);
- std::reverse(ZPRBegin, ZPREnd.base());
+ if (RegPairs.size() > 1) {
+ auto IsPPR = [](const RegPairInfo &c) { return c.Type == RegPairInfo::PPR; };
+ auto PPRBegin = std::find_if(RegPairs.begin(), RegPairs.end(), IsPPR);
+ auto PPREnd = std::find_if(RegPairs.rbegin(), RegPairs.rend(), IsPPR);
+ std::reverse(PPRBegin, PPREnd.base());
+ auto IsZPR = [](const RegPairInfo &c) { return c.Type == RegPairInfo::ZPR; };
+ auto ZPRBegin = std::find_if(RegPairs.begin(), RegPairs.end(), IsZPR);
+ auto ZPREnd = std::find_if(RegPairs.rbegin(), RegPairs.rend(), IsZPR);
+ std::reverse(ZPRBegin, ZPREnd.base());
+ }
for (const RegPairInfo &RPI : RegPairs) {
unsigned Reg1 = RPI.Reg1;
>From 80483c754dae45f62f28231ba8023705fc98b635 Mon Sep 17 00:00:00 2001
From: Scott Todd <scott.todd0 at gmail.com>
Date: Tue, 20 Feb 2024 09:58:15 -0800
Subject: [PATCH 2/3] Run clang-format.
---
llvm/lib/Target/AArch64/AArch64FrameLowering.cpp | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/llvm/lib/Target/AArch64/AArch64FrameLowering.cpp b/llvm/lib/Target/AArch64/AArch64FrameLowering.cpp
index 6c8117cb978df5..615e935932ceae 100644
--- a/llvm/lib/Target/AArch64/AArch64FrameLowering.cpp
+++ b/llvm/lib/Target/AArch64/AArch64FrameLowering.cpp
@@ -3116,16 +3116,21 @@ bool AArch64FrameLowering::restoreCalleeSavedRegisters(
// For performance reasons restore SVE register in increasing order
if (RegPairs.size() > 1) {
- auto IsPPR = [](const RegPairInfo &c) { return c.Type == RegPairInfo::PPR; };
+ auto IsPPR = [](const RegPairInfo &c) {
+ return c.Type == RegPairInfo::PPR;
+ };
auto PPRBegin = std::find_if(RegPairs.begin(), RegPairs.end(), IsPPR);
auto PPREnd = std::find_if(RegPairs.rbegin(), RegPairs.rend(), IsPPR);
std::reverse(PPRBegin, PPREnd.base());
- auto IsZPR = [](const RegPairInfo &c) { return c.Type == RegPairInfo::ZPR; };
+ auto IsZPR = [](const RegPairInfo &c) {
+ return c.Type == RegPairInfo::ZPR;
+ };
auto ZPRBegin = std::find_if(RegPairs.begin(), RegPairs.end(), IsZPR);
auto ZPREnd = std::find_if(RegPairs.rbegin(), RegPairs.rend(), IsZPR);
std::reverse(ZPRBegin, ZPREnd.base());
}
+
for (const RegPairInfo &RPI : RegPairs) {
unsigned Reg1 = RPI.Reg1;
unsigned Reg2 = RPI.Reg2;
>From 02cbedcdc7f0a9424609ec1f238aa72094f465b3 Mon Sep 17 00:00:00 2001
From: Scott Todd <scott.todd0 at gmail.com>
Date: Tue, 20 Feb 2024 10:02:13 -0800
Subject: [PATCH 3/3] Another clang-format fix. (entire file has diffs, keeping
local)
---
llvm/lib/Target/AArch64/AArch64FrameLowering.cpp | 1 -
1 file changed, 1 deletion(-)
diff --git a/llvm/lib/Target/AArch64/AArch64FrameLowering.cpp b/llvm/lib/Target/AArch64/AArch64FrameLowering.cpp
index 615e935932ceae..e6464f024d3365 100644
--- a/llvm/lib/Target/AArch64/AArch64FrameLowering.cpp
+++ b/llvm/lib/Target/AArch64/AArch64FrameLowering.cpp
@@ -3130,7 +3130,6 @@ bool AArch64FrameLowering::restoreCalleeSavedRegisters(
std::reverse(ZPRBegin, ZPREnd.base());
}
-
for (const RegPairInfo &RPI : RegPairs) {
unsigned Reg1 = RPI.Reg1;
unsigned Reg2 = RPI.Reg2;
More information about the llvm-commits
mailing list