[llvm] [AMDGPU] Validate user SGPR count against HW range, not field width (PR #194449)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Apr 27 13:01:19 PDT 2026
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-amdgpu
Author: Mariusz Sikora (mariusz-sikora-at-amd)
<details>
<summary>Changes</summary>
The previous validation checked only the field width, allowing values that exceeded the actual hardware limits (e.g. 0–16 on gfx6-gfx120 and 0–32 on gfx125x) as long as they fit in the bit width.
Tighten validation to reject out-of-range user SGPR counts.
---
Full diff: https://github.com/llvm/llvm-project/pull/194449.diff
3 Files Affected:
- (modified) llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp (+2-5)
- (added) llvm/test/MC/AMDGPU/hsa-gfx12-v4-user-sgpr-err.s (+13)
- (added) llvm/test/MC/AMDGPU/hsa-gfx125x-v4-user-sgpr-err.s (+14)
``````````diff
diff --git a/llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp b/llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp
index 103372d6e4c5c..987585fea8a6b 100644
--- a/llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp
+++ b/llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp
@@ -6357,6 +6357,8 @@ bool AMDGPUAsmParser::ParseDirectiveAMDHSAKernel() {
return TokError(".amdhsa_next_free_sgpr directive is required");
unsigned UserSGPRCount = ExplicitUserSGPRCount.value_or(ImpliedUserSGPRCount);
+ if (UserSGPRCount > getMaxNumUserSGPRs())
+ return TokError("too many user SGPRs enabled");
// Consider the case where the total number of UserSGPRs with trailing
// allocated preload SGPRs, is greater than the number of explicitly
@@ -6404,17 +6406,12 @@ bool AMDGPUAsmParser::ParseDirectiveAMDHSAKernel() {
"enabled user SGPRs");
if (isGFX1250Plus()) {
- if (!isUInt<COMPUTE_PGM_RSRC2_GFX125_USER_SGPR_COUNT_WIDTH>(UserSGPRCount))
- return TokError("too many user SGPRs enabled");
AMDGPU::MCKernelDescriptor::bits_set(
KD.compute_pgm_rsrc2,
MCConstantExpr::create(UserSGPRCount, getContext()),
COMPUTE_PGM_RSRC2_GFX125_USER_SGPR_COUNT_SHIFT,
COMPUTE_PGM_RSRC2_GFX125_USER_SGPR_COUNT, getContext());
} else {
- if (!isUInt<COMPUTE_PGM_RSRC2_GFX6_GFX120_USER_SGPR_COUNT_WIDTH>(
- UserSGPRCount))
- return TokError("too many user SGPRs enabled");
AMDGPU::MCKernelDescriptor::bits_set(
KD.compute_pgm_rsrc2,
MCConstantExpr::create(UserSGPRCount, getContext()),
diff --git a/llvm/test/MC/AMDGPU/hsa-gfx12-v4-user-sgpr-err.s b/llvm/test/MC/AMDGPU/hsa-gfx12-v4-user-sgpr-err.s
new file mode 100644
index 0000000000000..8519672f15de1
--- /dev/null
+++ b/llvm/test/MC/AMDGPU/hsa-gfx12-v4-user-sgpr-err.s
@@ -0,0 +1,13 @@
+// RUN: not llvm-mc -triple amdgcn-amd-amdhsa -mcpu=gfx1200 -filetype=null %s 2>&1 | FileCheck --check-prefix=ERR %s
+
+.text
+
+.amdhsa_kernel complete
+// user_sgpr_count range: 0-16
+// ERR: error: too many user SGPRs enabled
+ .amdhsa_user_sgpr_count 17
+
+ .amdhsa_next_free_vgpr 9
+ .amdhsa_next_free_sgpr 27
+.end_amdhsa_kernel
+
diff --git a/llvm/test/MC/AMDGPU/hsa-gfx125x-v4-user-sgpr-err.s b/llvm/test/MC/AMDGPU/hsa-gfx125x-v4-user-sgpr-err.s
new file mode 100644
index 0000000000000..55567f9142ccf
--- /dev/null
+++ b/llvm/test/MC/AMDGPU/hsa-gfx125x-v4-user-sgpr-err.s
@@ -0,0 +1,14 @@
+// RUN: not llvm-mc -triple amdgcn-amd-amdhsa -mcpu=gfx1250 -filetype=null %s 2>&1 | FileCheck --check-prefix=ERR %s
+// RUN: not llvm-mc -triple amdgcn-amd-amdhsa -mcpu=gfx1251 -filetype=null %s 2>&1 | FileCheck --check-prefix=ERR %s
+
+.text
+
+.amdhsa_kernel complete
+// user_sgpr_count range: 0-32
+// ERR: error: too many user SGPRs enabled
+ .amdhsa_user_sgpr_count 33
+
+ .amdhsa_next_free_vgpr 9
+ .amdhsa_next_free_sgpr 27
+.end_amdhsa_kernel
+
``````````
</details>
https://github.com/llvm/llvm-project/pull/194449
More information about the llvm-commits
mailing list