[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:55:45 PDT 2026


https://github.com/wenhu1024 created https://github.com/llvm/llvm-project/pull/226091

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

>From b3e9bfdea7ab725930655b60a37de9860eb6bd96 Mon Sep 17 00:00:00 2001
From: wenhu1024 <1340773297 at qq.com>
Date: Thu, 24 Sep 2026 17:45:29 +0800
Subject: [PATCH] [NVPTX] Emit sub-byte kernel parameters as u8 in AsmPrinter

---
 llvm/lib/Target/NVPTX/NVPTXAsmPrinter.cpp |  5 +++--
 llvm/test/CodeGen/NVPTX/i1-param.ll       | 15 +++++++++++----
 2 files changed, 14 insertions(+), 6 deletions(-)

diff --git a/llvm/lib/Target/NVPTX/NVPTXAsmPrinter.cpp b/llvm/lib/Target/NVPTX/NVPTXAsmPrinter.cpp
index a7d7b55c81fffc..9247a6304b159d 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 14d417bca459d2..63bab35e30e49d 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



More information about the llvm-commits mailing list