[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