[llvm] [NVPTX] Emit sub-byte kernel parameters as u8 in AsmPrinter (PR #226091)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Sep 24 02:56:41 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-nvptx
Author: wenhu1024
<details>
<summary>Changes</summary>
PTX does not support sub-byte integer kernel parameter types.
Emit integer kernel parameters smaller than 8 bits as `.u8` in `NVPTXAsmPrinter`, matching the existing parameter lowering behavior.
Fixes #<!-- -->225261
---
Full diff: https://github.com/llvm/llvm-project/pull/226091.diff
2 Files Affected:
- (modified) llvm/lib/Target/NVPTX/NVPTXAsmPrinter.cpp (+3-2)
- (modified) llvm/test/CodeGen/NVPTX/i1-param.ll (+11-4)
``````````diff
diff --git a/llvm/lib/Target/NVPTX/NVPTXAsmPrinter.cpp b/llvm/lib/Target/NVPTX/NVPTXAsmPrinter.cpp
index a7d7b55c81fff..9247a6304b159 100644
--- a/llvm/lib/Target/NVPTX/NVPTXAsmPrinter.cpp
+++ b/llvm/lib/Target/NVPTX/NVPTXAsmPrinter.cpp
@@ -2023,8 +2023,9 @@ void NVPTXAsmPrinter::emitFunctionParamList(const Function *F, raw_ostream &O) {
// non-pointer scalar to kernel func
O << "\t.param .";
- // Special case: predicate operands become .u8 types
- if (Ty->isIntegerTy(1))
+ // PTX does not support sub-byte integer parameter types, so promote
+ // them to .u8 when emitting kernel parameter declarations.
+ if (Ty->isIntegerTy() && Ty->getIntegerBitWidth() < 8)
O << "u8";
else
O << getPTXFundamentalTypeStr(Ty);
diff --git a/llvm/test/CodeGen/NVPTX/i1-param.ll b/llvm/test/CodeGen/NVPTX/i1-param.ll
index 14d417bca459d..63bab35e30e49 100644
--- a/llvm/test/CodeGen/NVPTX/i1-param.ll
+++ b/llvm/test/CodeGen/NVPTX/i1-param.ll
@@ -4,12 +4,19 @@
target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v16:16:16-v32:32:32-v64:64:64-v128:128:128-n16:32:64"
target triple = "nvptx-nvidia-cuda"
-; Make sure predicate (i1) operands to kernels get expanded out to .u8
+; Make sure sub-byte integer operands to kernels get expanded out to .u8.
; CHECK: .entry foo
-; CHECK: .param .u8 foo_param_0
-; CHECK: .param .u64 .ptr .align 1 foo_param_1
-define ptx_kernel void @foo(i1 %p, ptr %out) {
+; CHECK: .param .u8 foo_param_0,
+; CHECK: .param .u8 foo_param_1,
+; CHECK: .param .u8 foo_param_2,
+; CHECK: .param .u8 foo_param_3,
+; CHECK: .param .u8 foo_param_4,
+; CHECK: .param .u8 foo_param_5,
+; CHECK: .param .u8 foo_param_6,
+; CHECK: .param .u64 .ptr .align 1 foo_param_7
+define ptx_kernel void @foo(i1 %p, i2 %p2, i3 %p3, i4 %p4, i5 %p5, i6 %p6,
+ i7 %p7, ptr %out) {
%val = zext i1 %p to i32
store i32 %val, ptr %out
ret void
``````````
</details>
https://github.com/llvm/llvm-project/pull/226091
More information about the llvm-commits
mailing list