aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard-Qin-X <richard.qin.001@gmail.com>2026-08-29 00:36:55 +0800
committerRichard-Qin-X <richard.qin.001@gmail.com>2026-08-29 00:36:55 +0800
commit96cc3e77afff5627cf1cacf42f788a752de00f74 (patch)
treea79c591459648377dd04ab8d6ecce89e08fde5e9
parent3d4bd273c2d7df2d96d2e741227e3f23b8734879 (diff)
downloadrcc-project-96cc3e77afff5627cf1cacf42f788a752de00f74.tar.gz
rcc-project-96cc3e77afff5627cf1cacf42f788a752de00f74.tar.xz
[RISCV] Reuse validated Zcmp frame offsets
-rw-r--r--backend/lib/Target/RISCV/RISCVFrameLowering.cpp20
1 files changed, 12 insertions, 8 deletions
diff --git a/backend/lib/Target/RISCV/RISCVFrameLowering.cpp b/backend/lib/Target/RISCV/RISCVFrameLowering.cpp
index 206681a..02520a7 100644
--- a/backend/lib/Target/RISCV/RISCVFrameLowering.cpp
+++ b/backend/lib/Target/RISCV/RISCVFrameLowering.cpp
@@ -1251,16 +1251,17 @@ validateCalleeSaveObjects(const MachineFunction &Function,
"RISC-V callee-save object names a caller-saved register");
}
const auto SaveRestoreIndex = saveRestoreRegisterIndex(Reg);
- const bool ManagedByZcmp = ZcmpInfo && zcmpManagesRegister(*ZcmpInfo, Reg);
+ std::optional<std::int64_t> ExpectedOffset;
+ if (ZcmpInfo && SaveRestoreIndex && *SaveRestoreIndex < ZcmpInfo->RegisterCount) {
+ ExpectedOffset = -static_cast<std::int64_t>(ZcmpInfo->RegisterCount - *SaveRestoreIndex) * 8;
+ }
+ const bool ManagedByZcmp = ExpectedOffset.has_value();
const bool ManagedByLibCall = !ZcmpInfo && Features.has(RISCVSubtargetOption::SaveRestore) &&
SaveRestoreIndex.has_value();
const StackObjectKind ExpectedKind = ManagedByZcmp || ManagedByLibCall
? StackObjectKind::FixedSpillSlot
: StackObjectKind::CalleeSaved;
- std::optional<std::int64_t> ExpectedOffset;
- if (ManagedByZcmp) {
- ExpectedOffset = -static_cast<std::int64_t>(ZcmpInfo->RegisterCount - *SaveRestoreIndex) * 8;
- } else if (ManagedByLibCall) {
+ if (ManagedByLibCall) {
ExpectedOffset = -static_cast<std::int64_t>(*SaveRestoreIndex + 1U) * 8;
}
if (Description.Kind != ExpectedKind || Description.Size != std::optional<std::uint64_t>{8} ||
@@ -1439,7 +1440,11 @@ public:
continue;
StackObjectDesc Description;
const auto SaveRestoreIndex = saveRestoreRegisterIndex(Reg);
- const bool ManagedByZcmp = ZcmpInfo && zcmpManagesRegister(*ZcmpInfo, Reg);
+ std::optional<std::int64_t> ZcmpOffset;
+ if (ZcmpInfo && SaveRestoreIndex && *SaveRestoreIndex < ZcmpInfo->RegisterCount) {
+ ZcmpOffset = -static_cast<std::int64_t>(ZcmpInfo->RegisterCount - *SaveRestoreIndex) * 8;
+ }
+ const bool ManagedByZcmp = ZcmpOffset.has_value();
const bool ManagedByLibCall = !ZcmpInfo &&
Subtarget.features().has(RISCVSubtargetOption::SaveRestore) &&
SaveRestoreIndex;
@@ -1449,8 +1454,7 @@ public:
Description.Align =
ManagedByLibCall && (*SaveRestoreIndex + 1U) % 2U == 0 ? *Align16 : *Align8;
if (ManagedByZcmp) {
- Description.Offset =
- -static_cast<std::int64_t>(ZcmpInfo->RegisterCount - *SaveRestoreIndex) * 8;
+ Description.Offset = ZcmpOffset;
} else if (ManagedByLibCall) {
Description.Offset = -static_cast<std::int64_t>(*SaveRestoreIndex + 1U) * 8;
}