[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 09:58:34 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/2] [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/2] 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;



More information about the llvm-commits mailing list