From 96cc3e77afff5627cf1cacf42f788a752de00f74 Mon Sep 17 00:00:00 2001 From: Richard-Qin-X Date: Sat, 29 Aug 2026 00:36:55 +0800 Subject: [RISCV] Reuse validated Zcmp frame offsets --- backend/lib/Target/RISCV/RISCVFrameLowering.cpp | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) (limited to 'backend/lib') 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 ExpectedOffset; + if (ZcmpInfo && SaveRestoreIndex && *SaveRestoreIndex < ZcmpInfo->RegisterCount) { + ExpectedOffset = -static_cast(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 ExpectedOffset; - if (ManagedByZcmp) { - ExpectedOffset = -static_cast(ZcmpInfo->RegisterCount - *SaveRestoreIndex) * 8; - } else if (ManagedByLibCall) { + if (ManagedByLibCall) { ExpectedOffset = -static_cast(*SaveRestoreIndex + 1U) * 8; } if (Description.Kind != ExpectedKind || Description.Size != std::optional{8} || @@ -1439,7 +1440,11 @@ public: continue; StackObjectDesc Description; const auto SaveRestoreIndex = saveRestoreRegisterIndex(Reg); - const bool ManagedByZcmp = ZcmpInfo && zcmpManagesRegister(*ZcmpInfo, Reg); + std::optional ZcmpOffset; + if (ZcmpInfo && SaveRestoreIndex && *SaveRestoreIndex < ZcmpInfo->RegisterCount) { + ZcmpOffset = -static_cast(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(ZcmpInfo->RegisterCount - *SaveRestoreIndex) * 8; + Description.Offset = ZcmpOffset; } else if (ManagedByLibCall) { Description.Offset = -static_cast(*SaveRestoreIndex + 1U) * 8; } -- cgit v1.2.3