[llvm] [AArch64] Fix register reversing crash on MSVC with 1 pair. (PR #82392)

via llvm-commits llvm-commits at lists.llvm.org
Tue Feb 20 09:54:54 PST 2024


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-backend-aarch64

Author: Scott Todd (ScottTodd)

<details>
<summary>Changes</summary>

This fixes the crash reported here: https://github.com/llvm/llvm-project/pull/79623#discussion_r1496160694 where this assert was hit:
```c++
#if _ITERATOR_DEBUG_LEVEL != 0
template <class _Ty>
constexpr void _Verify_range(const _Ty* const _First, const _Ty* const _Last) noexcept {
    // special case range verification for pointers
    _STL_VERIFY(_First <= _Last, "transposed pointer range");
}
#endif // _ITERATOR_DEBUG_LEVEL != 0
```

Info from the debugger on the test case that crashed: 
![image](https://github.com/llvm/llvm-project/assets/4010439/ad33e4cc-0f9a-435b-9816-6aba75a19107)

---
Full diff: https://github.com/llvm/llvm-project/pull/82392.diff


1 Files Affected:

- (modified) llvm/lib/Target/AArch64/AArch64FrameLowering.cpp (+10-8) 


``````````diff
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;

``````````

</details>


https://github.com/llvm/llvm-project/pull/82392


More information about the llvm-commits mailing list