[llvm] [CodeGen] Avoid register pressure limit underflow (PR #216372)
via llvm-commits
llvm-commits at lists.llvm.org
Fri Aug 14 11:09:05 PDT 2026
https://github.com/hjagasiaAMD created https://github.com/llvm/llvm-project/pull/216372
Keep the target-provided limit when reserved-register weight meets or exceeds it, preventing unsigned wraparound from disabling pressure checks.
>From 4d1979158f32ceadb5602b532f72f942a2fb5cf3 Mon Sep 17 00:00:00 2001
From: Harsha Jagasia <harsha.jagasia at amd.com>
Date: Fri, 14 Aug 2026 17:55:50 +0000
Subject: [PATCH] [CodeGen] Avoid register pressure limit underflow
Keep the target-provided limit when reserved-register weight meets or exceeds it, preventing unsigned wraparound from disabling pressure checks.
---
llvm/lib/CodeGen/RegisterClassInfo.cpp | 5 ++-
.../AMDGPU/register-class-info-pset-limit.mir | 41 +++++++++++++++++++
2 files changed, 45 insertions(+), 1 deletion(-)
create mode 100644 llvm/test/CodeGen/AMDGPU/register-class-info-pset-limit.mir
diff --git a/llvm/lib/CodeGen/RegisterClassInfo.cpp b/llvm/lib/CodeGen/RegisterClassInfo.cpp
index 4b011001aa6ce..80a584f917150 100644
--- a/llvm/lib/CodeGen/RegisterClassInfo.cpp
+++ b/llvm/lib/CodeGen/RegisterClassInfo.cpp
@@ -213,7 +213,10 @@ unsigned RegisterClassInfo::computePSetLimit(unsigned Idx) const {
if (NAllocatableRegs == 0)
return RegPressureSetLimit;
unsigned NReserved = RC->getNumRegs() - NAllocatableRegs;
- return RegPressureSetLimit - TRI->getRegClassWeight(RC).RegWeight * NReserved;
+ unsigned ReservedRegWeight = TRI->getRegClassWeight(RC).RegWeight * NReserved;
+ if (ReservedRegWeight >= RegPressureSetLimit)
+ return RegPressureSetLimit;
+ return RegPressureSetLimit - ReservedRegWeight;
}
INITIALIZE_PASS(MachineRegisterClassInfoWrapperPass,
diff --git a/llvm/test/CodeGen/AMDGPU/register-class-info-pset-limit.mir b/llvm/test/CodeGen/AMDGPU/register-class-info-pset-limit.mir
new file mode 100644
index 0000000000000..30bb1c6ad461d
--- /dev/null
+++ b/llvm/test/CodeGen/AMDGPU/register-class-info-pset-limit.mir
@@ -0,0 +1,41 @@
+# RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx803 -run-pass=machine-scheduler \
+# RUN: -debug-only=machine-scheduler -o /dev/null %s 2>&1 | FileCheck %s
+# REQUIRES: asserts
+
+# The reported SGPR pressure-set limit is smaller than the weight of the
+# registers reserved from SGPR_32. Check that subtracting the reserved weight
+# does not wrap around.
+
+# CHECK: SReg_32 Limit 6 Actual 13
+# CHECK: Excess PSets: SReg_32
+
+--- |
+ define amdgpu_kernel void @reserved_weight_exceeds_limit() #0 {
+ ret void
+ }
+
+ attributes #0 = { "amdgpu-num-sgpr"="12" }
+...
+---
+name: reserved_weight_exceeds_limit
+tracksRegLiveness: true
+machineFunctionInfo:
+ isEntryFunction: true
+body: |
+ bb.0:
+ %0:sgpr_32 = S_MOV_B32 0
+ %1:sgpr_32 = S_MOV_B32 1
+ %2:sgpr_32 = S_MOV_B32 2
+ %3:sgpr_32 = S_MOV_B32 3
+ %4:sgpr_32 = S_MOV_B32 4
+ %5:sgpr_32 = S_MOV_B32 5
+ %6:sgpr_32 = S_MOV_B32 6
+ %7:sgpr_32 = S_MOV_B32 7
+ %8:sgpr_32 = S_MOV_B32 8
+ %9:sgpr_32 = S_MOV_B32 9
+ %10:sgpr_32 = S_MOV_B32 10
+ %11:sgpr_32 = S_MOV_B32 11
+ %12:sgpr_32 = S_MOV_B32 12
+ S_NOP 0, implicit %0, implicit %1, implicit %2, implicit %3, implicit %4, implicit %5, implicit %6, implicit %7, implicit %8, implicit %9, implicit %10, implicit %11, implicit %12
+ S_ENDPGM 0
+...
More information about the llvm-commits
mailing list