[llvm] [AArch64] Reserve `W30_HI` and `[BHSDQ]31_HI` (PR #202929)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Jun 10 03:59:08 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-aarch64
Author: Nathan Corbyn (cofibrant)
<details>
<summary>Changes</summary>
The compiler currently doesn't reserve the artificial registers `W30_HI` or `[BHSDQ]31_HI` due to a family of off-by-one errors in `AArch64RegisterInfo.cpp`. This patch repairs this issue.
---
Full diff: https://github.com/llvm/llvm-project/pull/202929.diff
2 Files Affected:
- (modified) llvm/lib/Target/AArch64/AArch64RegisterInfo.cpp (+6-6)
- (modified) llvm/unittests/Target/AArch64/AArch64RegisterInfoTest.cpp (+32)
``````````diff
diff --git a/llvm/lib/Target/AArch64/AArch64RegisterInfo.cpp b/llvm/lib/Target/AArch64/AArch64RegisterInfo.cpp
index 106676c67c94b..9e55b29426dd2 100644
--- a/llvm/lib/Target/AArch64/AArch64RegisterInfo.cpp
+++ b/llvm/lib/Target/AArch64/AArch64RegisterInfo.cpp
@@ -499,22 +499,22 @@ AArch64RegisterInfo::getStrictlyReservedRegs(const MachineFunction &MF) const {
Reserved.set(AArch64::WZR_HI);
static_assert(AArch64::W30_HI - AArch64::W0_HI == 30,
"Unexpected order of registers");
- Reserved.set(AArch64::W0_HI, AArch64::W30_HI);
+ Reserved.set(AArch64::W0_HI, AArch64::W30_HI + 1);
static_assert(AArch64::B31_HI - AArch64::B0_HI == 31,
"Unexpected order of registers");
- Reserved.set(AArch64::B0_HI, AArch64::B31_HI);
+ Reserved.set(AArch64::B0_HI, AArch64::B31_HI + 1);
static_assert(AArch64::H31_HI - AArch64::H0_HI == 31,
"Unexpected order of registers");
- Reserved.set(AArch64::H0_HI, AArch64::H31_HI);
+ Reserved.set(AArch64::H0_HI, AArch64::H31_HI + 1);
static_assert(AArch64::S31_HI - AArch64::S0_HI == 31,
"Unexpected order of registers");
- Reserved.set(AArch64::S0_HI, AArch64::S31_HI);
+ Reserved.set(AArch64::S0_HI, AArch64::S31_HI + 1);
static_assert(AArch64::D31_HI - AArch64::D0_HI == 31,
"Unexpected order of registers");
- Reserved.set(AArch64::D0_HI, AArch64::D31_HI);
+ Reserved.set(AArch64::D0_HI, AArch64::D31_HI + 1);
static_assert(AArch64::Q31_HI - AArch64::Q0_HI == 31,
"Unexpected order of registers");
- Reserved.set(AArch64::Q0_HI, AArch64::Q31_HI);
+ Reserved.set(AArch64::Q0_HI, AArch64::Q31_HI + 1);
return Reserved;
}
diff --git a/llvm/unittests/Target/AArch64/AArch64RegisterInfoTest.cpp b/llvm/unittests/Target/AArch64/AArch64RegisterInfoTest.cpp
index 9efe97567331b..8b58098436375 100644
--- a/llvm/unittests/Target/AArch64/AArch64RegisterInfoTest.cpp
+++ b/llvm/unittests/Target/AArch64/AArch64RegisterInfoTest.cpp
@@ -149,4 +149,36 @@ TEST(AArch64LaneBitmasks, SubRegs) {
AArch64::W1);
}
+TEST(AArch64ReservedRegs, ArtificialHIRegistersAreReserved) {
+ std::unique_ptr<TargetMachine> TM = createTargetMachine("");
+ ASSERT_TRUE(TM);
+
+ std::unique_ptr<AArch64InstrInfo> II = createInstrInfo(TM.get());
+ ASSERT_TRUE(II);
+
+ const AArch64RegisterInfo &TRI = II->getRegisterInfo();
+
+ // Create an empty machine function
+ LLVMContext Context;
+ Module M("", Context);
+ M.setDataLayout(TM->createDataLayout());
+ Function *F = Function::Create(
+ FunctionType::get(Type::getVoidTy(Context), /*isVarArg=*/false),
+ GlobalValue::ExternalLinkage, "f", &M);
+
+ MachineModuleInfo MMI(TM.get());
+ const TargetSubtargetInfo *STI = TM->getSubtargetImpl(*F);
+ MachineFunction MF(*F, *TM, *STI, MMI.getContext(), /*FunctionNum=*/0);
+ MF.initTargetMachineFunctionInfo(*STI);
+
+ BitVector Reserved = TRI.getReservedRegs(MF);
+
+ EXPECT_TRUE(Reserved.test(AArch64::W30_HI));
+ EXPECT_TRUE(Reserved.test(AArch64::B31_HI));
+ EXPECT_TRUE(Reserved.test(AArch64::H31_HI));
+ EXPECT_TRUE(Reserved.test(AArch64::S31_HI));
+ EXPECT_TRUE(Reserved.test(AArch64::D31_HI));
+ EXPECT_TRUE(Reserved.test(AArch64::Q31_HI));
+}
+
} // namespace
``````````
</details>
https://github.com/llvm/llvm-project/pull/202929
More information about the llvm-commits
mailing list