diff options
| author | Richard-Qin-X <richard.qin.001@gmail.com> | 2026-08-29 00:36:55 +0800 |
|---|---|---|
| committer | Richard-Qin-X <richard.qin.001@gmail.com> | 2026-08-29 00:36:55 +0800 |
| commit | 96cc3e77afff5627cf1cacf42f788a752de00f74 (patch) | |
| tree | a79c591459648377dd04ab8d6ecce89e08fde5e9 | |
| parent | 3d4bd273c2d7df2d96d2e741227e3f23b8734879 (diff) | |
| download | rcc-project-96cc3e77afff5627cf1cacf42f788a752de00f74.tar.gz rcc-project-96cc3e77afff5627cf1cacf42f788a752de00f74.tar.xz | |
[RISCV] Reuse validated Zcmp frame offsets
| -rw-r--r-- | backend/lib/Target/RISCV/RISCVFrameLowering.cpp | 20 |
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; } |
