[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