[llvm] [AMDGPU] Rematerialize VGPR candidates when SGPR spills results in VGPR Excess (PR #168079)
Lucas Ramirez via llvm-commits
llvm-commits at lists.llvm.org
Thu Dec 18 08:26:24 PST 2025
Juan Manuel Martinez =?utf-8?q?Caamaño?=,
Juan Manuel Martinez =?utf-8?q?Caamaño?=,
Juan Manuel Martinez =?utf-8?q?Caamaño?=,
Juan Manuel Martinez =?utf-8?q?Caamaño?=,
Juan Manuel Martinez =?utf-8?q?Caamaño?Message-ID:
In-Reply-To: <llvm.org/llvm/llvm-project/pull/168079 at github.com>
================
@@ -97,6 +97,46 @@ void GCNRegPressure::inc(unsigned Reg,
Value[RegKind] += Sign;
}
+struct RegExcess {
+ unsigned SGPR = 0;
+ unsigned VGPR = 0;
+ unsigned ArchVGPR = 0;
+ unsigned AGPR = 0;
+
+ bool anyExcess() const { return SGPR || VGPR || ArchVGPR || AGPR; }
+ bool spillsToMemory() const { return VGPR || ArchVGPR || AGPR; }
+
+ RegExcess(const MachineFunction &MF, const GCNRegPressure &RP,
+ unsigned MaxSGPRs, unsigned MaxVGPRs) {
+ const GCNSubtarget &ST = MF.getSubtarget<GCNSubtarget>();
+ SGPR = std::max(static_cast<int>(RP.getSGPRNum() - MaxSGPRs), 0);
+
+ // The number of virtual VGPRs required to handle excess SGPR
+ unsigned WaveSize = ST.getWavefrontSize();
+ unsigned VGPRForSGPRSpills = divideCeil(SGPR, WaveSize);
+
+ unsigned MaxArchVGPRs = ST.getAddressableNumArchVGPRs();
+
+ // Unified excess pressure conditions, accounting for VGPRs used for SGPR
+ // spills
+ VGPR = std::max(static_cast<int>(RP.getVGPRNum(ST.hasGFX90AInsts()) +
+ VGPRForSGPRSpills - MaxVGPRs),
+ 0);
+
+ // Arch VGPR excess pressure conditions, accounting for VGPRs used for SGPR
+ // spills
+ ArchVGPR = std::max(static_cast<int>(RP.getVGPRNum(false) +
----------------
lucas-rami wrote:
Nevermind, tried this locally and it seems to work.
https://github.com/llvm/llvm-project/pull/168079
More information about the llvm-commits
mailing list