[llvm] [AMDGPU] Skip printf runtime binding if function signature is unexpected (PR #177573)
Steffen Larsen via llvm-commits
llvm-commits at lists.llvm.org
Mon Jan 26 00:51:09 PST 2026
https://github.com/steffenlarsen updated https://github.com/llvm/llvm-project/pull/177573
>From b399b588f2f9f4806b39a4e867b5935789cb07d2 Mon Sep 17 00:00:00 2001
From: Steffen Holst Larsen <HolstLarsen.Steffen at amd.com>
Date: Fri, 23 Jan 2026 06:16:55 -0600
Subject: [PATCH 1/4] [AMDGPU] Skip printf runtime binding if function
signature is unexpected
When creating the binding for OpenCL printf calls, we expect the
signature of the function to match the OpenCL specification. If the
signature is unexpected, this patch makes the pass skip creating the
binding to avoid incorrect behavior and crashes.
Signed-off-by: Steffen Holst Larsen <HolstLarsen.Steffen at amd.com>
---
.../AMDGPU/AMDGPUPrintfRuntimeBinding.cpp | 7 +++
.../AMDGPU/opencl-printf-invalid-first-arg.ll | 38 ++++++++++++++
.../AMDGPU/opencl-printf-invalid-return.ll | 52 +++++++++++++++++++
.../AMDGPU/opencl-printf-non-variadic.ll | 46 ++++++++++++++++
.../AMDGPU/opencl-printf-too-many-args.ll | 52 +++++++++++++++++++
5 files changed, 195 insertions(+)
create mode 100644 llvm/test/CodeGen/AMDGPU/opencl-printf-invalid-first-arg.ll
create mode 100644 llvm/test/CodeGen/AMDGPU/opencl-printf-invalid-return.ll
create mode 100644 llvm/test/CodeGen/AMDGPU/opencl-printf-non-variadic.ll
create mode 100644 llvm/test/CodeGen/AMDGPU/opencl-printf-too-many-args.ll
diff --git a/llvm/lib/Target/AMDGPU/AMDGPUPrintfRuntimeBinding.cpp b/llvm/lib/Target/AMDGPU/AMDGPUPrintfRuntimeBinding.cpp
index e920fd91a8835..5ccba80810174 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPUPrintfRuntimeBinding.cpp
+++ b/llvm/lib/Target/AMDGPU/AMDGPUPrintfRuntimeBinding.cpp
@@ -438,6 +438,13 @@ bool AMDGPUPrintfRuntimeBindingImpl::run(Module &M) {
M.getModuleFlag("openmp"))
return false;
+ // Verify the signature of the printf function and skip if it isn't correct.
+ const FunctionType *PrintfFunctionTy = PrintfFunction->getFunctionType();
+ if (PrintfFunctionTy->getNumParams() != 1 || !PrintfFunctionTy->isVarArg() ||
+ !PrintfFunctionTy->getReturnType()->isIntegerTy(32) ||
+ !PrintfFunctionTy->getParamType(0)->isPointerTy())
+ return false;
+
for (auto &U : PrintfFunction->uses()) {
if (auto *CI = dyn_cast<CallInst>(U.getUser())) {
if (CI->isCallee(&U) && !CI->isNoBuiltin())
diff --git a/llvm/test/CodeGen/AMDGPU/opencl-printf-invalid-first-arg.ll b/llvm/test/CodeGen/AMDGPU/opencl-printf-invalid-first-arg.ll
new file mode 100644
index 0000000000000..fc00187c4a897
--- /dev/null
+++ b/llvm/test/CodeGen/AMDGPU/opencl-printf-invalid-first-arg.ll
@@ -0,0 +1,38 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
+; RUN: opt -mtriple=r600-- -passes=amdgpu-printf-runtime-binding -mcpu=r600 -S < %s | FileCheck %s
+; RUN: opt -mtriple=amdgcn-- -passes=amdgpu-printf-runtime-binding -mcpu=fiji -S < %s | FileCheck %s
+; RUN: opt -mtriple=amdgcn--amdhsa -passes=amdgpu-printf-runtime-binding -mcpu=fiji -S < %s | FileCheck %s
+
+define amdgpu_kernel void @test_kernel(i32 %n) {
+; CHECK-LABEL: define amdgpu_kernel void @test_kernel(
+; CHECK-SAME: i32 [[N:%.*]]) #[[ATTR0:[0-9]+]] {
+; CHECK-NEXT: [[ENTRY:.*:]]
+; CHECK-NEXT: [[MEM:%.*]] = alloca float, align 4, addrspace(5)
+; CHECK-NEXT: [[STR:%.*]] = alloca [9 x i8], align 1, addrspace(5)
+; CHECK-NEXT: [[CALL1:%.*]] = call float (i32, ...) @printf(i32 [[N]], ptr addrspace(5) [[STR]], i32 [[N]])
+; CHECK-NEXT: store float [[CALL1]], ptr addrspace(5) [[MEM]], align 4
+; CHECK-NEXT: ret void
+;
+entry:
+ %mem = alloca float, align 4, addrspace(5)
+ %str = alloca [9 x i8], align 1, addrspace(5)
+ %call1 = call float (i32, ...) @printf(i32 %n, ptr addrspace(5) %str, i32 %n)
+ store float %call1, ptr addrspace(5) %mem, align 4
+ ret void
+}
+
+define float @test_func(i32 %n) {
+; CHECK-LABEL: define float @test_func(
+; CHECK-SAME: i32 [[N:%.*]]) #[[ATTR0]] {
+; CHECK-NEXT: [[ENTRY:.*:]]
+; CHECK-NEXT: [[STR:%.*]] = alloca [9 x i8], align 1, addrspace(5)
+; CHECK-NEXT: [[CALL1:%.*]] = call float (i32, ...) @printf(i32 [[N]], ptr addrspace(5) [[STR]], i32 [[N]])
+; CHECK-NEXT: ret float [[CALL1]]
+;
+entry:
+ %str = alloca [9 x i8], align 1, addrspace(5)
+ %call1 = call float (i32, ...) @printf(i32 %n, ptr addrspace(5) %str, i32 %n)
+ ret float %call1
+}
+
+declare float @printf(i32, ...)
diff --git a/llvm/test/CodeGen/AMDGPU/opencl-printf-invalid-return.ll b/llvm/test/CodeGen/AMDGPU/opencl-printf-invalid-return.ll
new file mode 100644
index 0000000000000..584aaf6ca99ad
--- /dev/null
+++ b/llvm/test/CodeGen/AMDGPU/opencl-printf-invalid-return.ll
@@ -0,0 +1,52 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
+; RUN: opt -mtriple=r600-- -passes=amdgpu-printf-runtime-binding -mcpu=r600 -S < %s | FileCheck %s
+; RUN: opt -mtriple=amdgcn-- -passes=amdgpu-printf-runtime-binding -mcpu=fiji -S < %s | FileCheck %s
+; RUN: opt -mtriple=amdgcn--amdhsa -passes=amdgpu-printf-runtime-binding -mcpu=fiji -S < %s | FileCheck %s
+
+ at .str = private unnamed_addr addrspace(4) constant [6 x i8] c"%s:%d\00", align 1
+
+define amdgpu_kernel void @test_kernel(i32 %n) {
+; CHECK-LABEL: define amdgpu_kernel void @test_kernel(
+; CHECK-SAME: i32 [[N:%.*]]) #[[ATTR0:[0-9]+]] {
+; CHECK-NEXT: [[ENTRY:.*:]]
+; CHECK-NEXT: [[MEM:%.*]] = alloca float, align 4, addrspace(5)
+; CHECK-NEXT: [[STR:%.*]] = alloca [9 x i8], align 1, addrspace(5)
+; CHECK-NEXT: [[CALL1:%.*]] = call float (ptr addrspace(4), ...) @printf(ptr addrspace(4) @.str, ptr addrspace(5) [[STR]], i32 [[N]])
+; CHECK-NEXT: store float [[CALL1]], ptr addrspace(5) [[MEM]], align 4
+; CHECK-NEXT: ret void
+;
+entry:
+ %mem = alloca float, align 4, addrspace(5)
+ %str = alloca [9 x i8], align 1, addrspace(5)
+ %call1 = call float (ptr addrspace(4), ...) @printf(ptr addrspace(4) @.str, ptr addrspace(5) %str, i32 %n)
+ store float %call1, ptr addrspace(5) %mem, align 4
+ ret void
+}
+
+define float @test_func(i32 %n) {
+; CHECK-LABEL: define float @test_func(
+; CHECK-SAME: i32 [[N:%.*]]) #[[ATTR0]] {
+; CHECK-NEXT: [[ENTRY:.*:]]
+; CHECK-NEXT: [[STR:%.*]] = alloca [9 x i8], align 1, addrspace(5)
+; CHECK-NEXT: [[CALL1:%.*]] = call float (ptr addrspace(4), ...) @printf(ptr addrspace(4) @.str, ptr addrspace(5) [[STR]], i32 [[N]])
+; CHECK-NEXT: ret float [[CALL1]]
+;
+entry:
+ %str = alloca [9 x i8], align 1, addrspace(5)
+ %call1 = call float (ptr addrspace(4), ...) @printf(ptr addrspace(4) @.str, ptr addrspace(5) %str, i32 %n)
+ ret float %call1
+}
+
+define float @test_null_argument(i32 %n) {
+; CHECK-LABEL: define float @test_null_argument(
+; CHECK-SAME: i32 [[N:%.*]]) #[[ATTR0]] {
+; CHECK-NEXT: [[STR:%.*]] = alloca [9 x i8], align 1, addrspace(5)
+; CHECK-NEXT: [[CALL1:%.*]] = call float (ptr addrspace(4), ...) @printf(ptr addrspace(4) null, ptr addrspace(5) [[STR]], i32 [[N]])
+; CHECK-NEXT: ret float [[CALL1]]
+;
+ %str = alloca [9 x i8], align 1, addrspace(5)
+ %call1 = call float (ptr addrspace(4), ...) @printf(ptr addrspace(4) null, ptr addrspace(5) %str, i32 %n)
+ ret float %call1
+}
+
+declare float @printf(ptr addrspace(4), ...)
diff --git a/llvm/test/CodeGen/AMDGPU/opencl-printf-non-variadic.ll b/llvm/test/CodeGen/AMDGPU/opencl-printf-non-variadic.ll
new file mode 100644
index 0000000000000..7380c097ecb8f
--- /dev/null
+++ b/llvm/test/CodeGen/AMDGPU/opencl-printf-non-variadic.ll
@@ -0,0 +1,46 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
+; RUN: opt -mtriple=r600-- -passes=amdgpu-printf-runtime-binding -mcpu=r600 -S < %s | FileCheck %s
+; RUN: opt -mtriple=amdgcn-- -passes=amdgpu-printf-runtime-binding -mcpu=fiji -S < %s | FileCheck %s
+; RUN: opt -mtriple=amdgcn--amdhsa -passes=amdgpu-printf-runtime-binding -mcpu=fiji -S < %s | FileCheck %s
+
+ at .str = private unnamed_addr addrspace(4) constant [6 x i8] c"%s:%d\00", align 1
+
+define amdgpu_kernel void @test_kernel(i32 %n) {
+; CHECK-LABEL: define amdgpu_kernel void @test_kernel(
+; CHECK-SAME: i32 [[N:%.*]]) #[[ATTR0:[0-9]+]] {
+; CHECK-NEXT: [[ENTRY:.*:]]
+; CHECK-NEXT: [[MEM:%.*]] = alloca i32, align 4, addrspace(5)
+; CHECK-NEXT: [[CALL1:%.*]] = call i32 @printf(ptr addrspace(4) @.str, i32 [[N]])
+; CHECK-NEXT: store i32 [[CALL1]], ptr addrspace(5) [[MEM]], align 4
+; CHECK-NEXT: ret void
+;
+entry:
+ %mem = alloca i32, align 4, addrspace(5)
+ %call1 = call i32 (ptr addrspace(4), i32) @printf(ptr addrspace(4) @.str, i32 %n)
+ store i32 %call1, ptr addrspace(5) %mem, align 4
+ ret void
+}
+
+define i32 @test_func(i32 %n) {
+; CHECK-LABEL: define i32 @test_func(
+; CHECK-SAME: i32 [[N:%.*]]) #[[ATTR0]] {
+; CHECK-NEXT: [[ENTRY:.*:]]
+; CHECK-NEXT: [[CALL1:%.*]] = call i32 @printf(ptr addrspace(4) @.str, i32 [[N]])
+; CHECK-NEXT: ret i32 [[CALL1]]
+;
+entry:
+ %call1 = call i32 (ptr addrspace(4), i32) @printf(ptr addrspace(4) @.str, i32 %n)
+ ret i32 %call1
+}
+
+define i32 @test_null_argument(i32 %n) {
+; CHECK-LABEL: define i32 @test_null_argument(
+; CHECK-SAME: i32 [[N:%.*]]) #[[ATTR0]] {
+; CHECK-NEXT: [[CALL1:%.*]] = call i32 @printf(ptr addrspace(4) null, i32 [[N]])
+; CHECK-NEXT: ret i32 [[CALL1]]
+;
+ %call1 = call i32 (ptr addrspace(4), i32) @printf(ptr addrspace(4) null, i32 %n)
+ ret i32 %call1
+}
+
+declare i32 @printf(ptr addrspace(4), i32)
diff --git a/llvm/test/CodeGen/AMDGPU/opencl-printf-too-many-args.ll b/llvm/test/CodeGen/AMDGPU/opencl-printf-too-many-args.ll
new file mode 100644
index 0000000000000..ffed256a47491
--- /dev/null
+++ b/llvm/test/CodeGen/AMDGPU/opencl-printf-too-many-args.ll
@@ -0,0 +1,52 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
+; RUN: opt -mtriple=r600-- -passes=amdgpu-printf-runtime-binding -mcpu=r600 -S < %s | FileCheck %s
+; RUN: opt -mtriple=amdgcn-- -passes=amdgpu-printf-runtime-binding -mcpu=fiji -S < %s | FileCheck %s
+; RUN: opt -mtriple=amdgcn--amdhsa -passes=amdgpu-printf-runtime-binding -mcpu=fiji -S < %s | FileCheck %s
+
+ at .str = private unnamed_addr addrspace(4) constant [6 x i8] c"%s:%d\00", align 1
+
+define amdgpu_kernel void @test_kernel(i32 %n) {
+; CHECK-LABEL: define amdgpu_kernel void @test_kernel(
+; CHECK-SAME: i32 [[N:%.*]]) #[[ATTR0:[0-9]+]] {
+; CHECK-NEXT: [[ENTRY:.*:]]
+; CHECK-NEXT: [[MEM:%.*]] = alloca float, align 4, addrspace(5)
+; CHECK-NEXT: [[STR:%.*]] = alloca [9 x i8], align 1, addrspace(5)
+; CHECK-NEXT: [[CALL1:%.*]] = call float (ptr addrspace(4), i32, ...) @printf(ptr addrspace(4) @.str, i32 [[N]], ptr addrspace(5) [[STR]], i32 [[N]])
+; CHECK-NEXT: store float [[CALL1]], ptr addrspace(5) [[MEM]], align 4
+; CHECK-NEXT: ret void
+;
+entry:
+ %mem = alloca float, align 4, addrspace(5)
+ %str = alloca [9 x i8], align 1, addrspace(5)
+ %call1 = call float (ptr addrspace(4), i32, ...) @printf(ptr addrspace(4) @.str, i32 %n, ptr addrspace(5) %str, i32 %n)
+ store float %call1, ptr addrspace(5) %mem, align 4
+ ret void
+}
+
+define float @test_func(i32 %n) {
+; CHECK-LABEL: define float @test_func(
+; CHECK-SAME: i32 [[N:%.*]]) #[[ATTR0]] {
+; CHECK-NEXT: [[ENTRY:.*:]]
+; CHECK-NEXT: [[STR:%.*]] = alloca [9 x i8], align 1, addrspace(5)
+; CHECK-NEXT: [[CALL1:%.*]] = call float (ptr addrspace(4), i32, ...) @printf(ptr addrspace(4) @.str, i32 [[N]], ptr addrspace(5) [[STR]], i32 [[N]])
+; CHECK-NEXT: ret float [[CALL1]]
+;
+entry:
+ %str = alloca [9 x i8], align 1, addrspace(5)
+ %call1 = call float (ptr addrspace(4), i32, ...) @printf(ptr addrspace(4) @.str, i32 %n, ptr addrspace(5) %str, i32 %n)
+ ret float %call1
+}
+
+define float @test_null_argument(i32 %n) {
+; CHECK-LABEL: define float @test_null_argument(
+; CHECK-SAME: i32 [[N:%.*]]) #[[ATTR0]] {
+; CHECK-NEXT: [[STR:%.*]] = alloca [9 x i8], align 1, addrspace(5)
+; CHECK-NEXT: [[CALL1:%.*]] = call float (ptr addrspace(4), i32, ...) @printf(ptr addrspace(4) null, i32 [[N]], ptr addrspace(5) [[STR]], i32 [[N]])
+; CHECK-NEXT: ret float [[CALL1]]
+;
+ %str = alloca [9 x i8], align 1, addrspace(5)
+ %call1 = call float (ptr addrspace(4), i32, ...) @printf(ptr addrspace(4) null, i32 %n, ptr addrspace(5) %str, i32 %n)
+ ret float %call1
+}
+
+declare float @printf(ptr addrspace(4), i32, ...)
>From 6fe43cf99e8d0c5ccb2cf343126b382ef3cbdfbc Mon Sep 17 00:00:00 2001
From: Steffen Holst Larsen <HolstLarsen.Steffen at amd.com>
Date: Fri, 23 Jan 2026 09:37:33 -0600
Subject: [PATCH 2/4] Add check and test for invalid address space format arg
Signed-off-by: Steffen Holst Larsen <HolstLarsen.Steffen at amd.com>
---
.../AMDGPU/AMDGPUPrintfRuntimeBinding.cpp | 11 +++-
...encl-printf-invalid-first-arg-addrspace.ll | 50 +++++++++++++++++++
...> opencl-printf-invalid-first-arg-type.ll} | 0
3 files changed, 59 insertions(+), 2 deletions(-)
create mode 100644 llvm/test/CodeGen/AMDGPU/opencl-printf-invalid-first-arg-addrspace.ll
rename llvm/test/CodeGen/AMDGPU/{opencl-printf-invalid-first-arg.ll => opencl-printf-invalid-first-arg-type.ll} (100%)
diff --git a/llvm/lib/Target/AMDGPU/AMDGPUPrintfRuntimeBinding.cpp b/llvm/lib/Target/AMDGPU/AMDGPUPrintfRuntimeBinding.cpp
index 5ccba80810174..8fb56f5295395 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPUPrintfRuntimeBinding.cpp
+++ b/llvm/lib/Target/AMDGPU/AMDGPUPrintfRuntimeBinding.cpp
@@ -441,8 +441,15 @@ bool AMDGPUPrintfRuntimeBindingImpl::run(Module &M) {
// Verify the signature of the printf function and skip if it isn't correct.
const FunctionType *PrintfFunctionTy = PrintfFunction->getFunctionType();
if (PrintfFunctionTy->getNumParams() != 1 || !PrintfFunctionTy->isVarArg() ||
- !PrintfFunctionTy->getReturnType()->isIntegerTy(32) ||
- !PrintfFunctionTy->getParamType(0)->isPointerTy())
+ !PrintfFunctionTy->getReturnType()->isIntegerTy(32))
+ return false;
+ Type *PrintfFormatArgTy = PrintfFunctionTy->getParamType(0);
+ if (!PrintfFormatArgTy->isPointerTy() ||
+ !(PrintfFormatArgTy->getPointerAddressSpace() == AMDGPUAS::FLAT_ADDRESS ||
+ PrintfFormatArgTy->getPointerAddressSpace() ==
+ AMDGPUAS::GLOBAL_ADDRESS ||
+ PrintfFormatArgTy->getPointerAddressSpace() ==
+ AMDGPUAS::CONSTANT_ADDRESS))
return false;
for (auto &U : PrintfFunction->uses()) {
diff --git a/llvm/test/CodeGen/AMDGPU/opencl-printf-invalid-first-arg-addrspace.ll b/llvm/test/CodeGen/AMDGPU/opencl-printf-invalid-first-arg-addrspace.ll
new file mode 100644
index 0000000000000..2cc28da9b3607
--- /dev/null
+++ b/llvm/test/CodeGen/AMDGPU/opencl-printf-invalid-first-arg-addrspace.ll
@@ -0,0 +1,50 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
+; RUN: opt -mtriple=r600-- -passes=amdgpu-printf-runtime-binding -mcpu=r600 -S < %s | FileCheck %s
+; RUN: opt -mtriple=amdgcn-- -passes=amdgpu-printf-runtime-binding -mcpu=fiji -S < %s | FileCheck %s
+; RUN: opt -mtriple=amdgcn--amdhsa -passes=amdgpu-printf-runtime-binding -mcpu=fiji -S < %s | FileCheck %s
+
+define amdgpu_kernel void @test_kernel(i32 %n) {
+; CHECK-LABEL: define amdgpu_kernel void @test_kernel(
+; CHECK-SAME: i32 [[N:%.*]]) #[[ATTR0:[0-9]+]] {
+; CHECK-NEXT: [[ENTRY:.*:]]
+; CHECK-NEXT: [[MEM:%.*]] = alloca i32, align 4, addrspace(5)
+; CHECK-NEXT: [[STR:%.*]] = alloca [9 x i8], align 1, addrspace(5)
+; CHECK-NEXT: [[CALL1:%.*]] = call i32 (ptr addrspace(5), ...) @printf(ptr addrspace(5) [[STR]], ptr addrspace(5) [[STR]], i32 [[N]])
+; CHECK-NEXT: store i32 [[CALL1]], ptr addrspace(5) [[MEM]], align 4
+; CHECK-NEXT: ret void
+;
+entry:
+ %mem = alloca i32, align 4, addrspace(5)
+ %str = alloca [9 x i8], align 1, addrspace(5)
+ %call1 = call i32 (ptr addrspace(5), ...) @printf(ptr addrspace(5) %str, ptr addrspace(5) %str, i32 %n)
+ store i32 %call1, ptr addrspace(5) %mem, align 4
+ ret void
+}
+
+define i32 @test_func(i32 %n) {
+; CHECK-LABEL: define i32 @test_func(
+; CHECK-SAME: i32 [[N:%.*]]) #[[ATTR0]] {
+; CHECK-NEXT: [[ENTRY:.*:]]
+; CHECK-NEXT: [[STR:%.*]] = alloca [9 x i8], align 1, addrspace(5)
+; CHECK-NEXT: [[CALL1:%.*]] = call i32 (ptr addrspace(5), ...) @printf(ptr addrspace(5) [[STR]], ptr addrspace(5) [[STR]], i32 [[N]])
+; CHECK-NEXT: ret i32 [[CALL1]]
+;
+entry:
+ %str = alloca [9 x i8], align 1, addrspace(5)
+ %call1 = call i32 (ptr addrspace(5), ...) @printf(ptr addrspace(5) %str, ptr addrspace(5) %str, i32 %n)
+ ret i32 %call1
+}
+
+define i32 @test_null_argument(i32 %n) {
+; CHECK-LABEL: define i32 @test_null_argument(
+; CHECK-SAME: i32 [[N:%.*]]) #[[ATTR0]] {
+; CHECK-NEXT: [[STR:%.*]] = alloca [9 x i8], align 1, addrspace(5)
+; CHECK-NEXT: [[CALL1:%.*]] = call i32 (ptr addrspace(5), ...) @printf(ptr addrspace(5) null, ptr addrspace(5) [[STR]], i32 [[N]])
+; CHECK-NEXT: ret i32 [[CALL1]]
+;
+ %str = alloca [9 x i8], align 1, addrspace(5)
+ %call1 = call i32 (ptr addrspace(5), ...) @printf(ptr addrspace(5) null, ptr addrspace(5) %str, i32 %n)
+ ret i32 %call1
+}
+
+declare i32 @printf(ptr addrspace(5), ...)
diff --git a/llvm/test/CodeGen/AMDGPU/opencl-printf-invalid-first-arg.ll b/llvm/test/CodeGen/AMDGPU/opencl-printf-invalid-first-arg-type.ll
similarity index 100%
rename from llvm/test/CodeGen/AMDGPU/opencl-printf-invalid-first-arg.ll
rename to llvm/test/CodeGen/AMDGPU/opencl-printf-invalid-first-arg-type.ll
>From 7371b2192988861dfdf63094a55ae0f173a19559 Mon Sep 17 00:00:00 2001
From: Steffen Holst Larsen <HolstLarsen.Steffen at amd.com>
Date: Mon, 26 Jan 2026 02:49:50 -0600
Subject: [PATCH 3/4] Check addr space with isFlatGlobalAddrSpace
Signed-off-by: Steffen Holst Larsen <HolstLarsen.Steffen at amd.com>
---
llvm/lib/Target/AMDGPU/AMDGPUPrintfRuntimeBinding.cpp | 7 ++-----
1 file changed, 2 insertions(+), 5 deletions(-)
diff --git a/llvm/lib/Target/AMDGPU/AMDGPUPrintfRuntimeBinding.cpp b/llvm/lib/Target/AMDGPU/AMDGPUPrintfRuntimeBinding.cpp
index 8fb56f5295395..d3fa423d6099f 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPUPrintfRuntimeBinding.cpp
+++ b/llvm/lib/Target/AMDGPU/AMDGPUPrintfRuntimeBinding.cpp
@@ -445,11 +445,8 @@ bool AMDGPUPrintfRuntimeBindingImpl::run(Module &M) {
return false;
Type *PrintfFormatArgTy = PrintfFunctionTy->getParamType(0);
if (!PrintfFormatArgTy->isPointerTy() ||
- !(PrintfFormatArgTy->getPointerAddressSpace() == AMDGPUAS::FLAT_ADDRESS ||
- PrintfFormatArgTy->getPointerAddressSpace() ==
- AMDGPUAS::GLOBAL_ADDRESS ||
- PrintfFormatArgTy->getPointerAddressSpace() ==
- AMDGPUAS::CONSTANT_ADDRESS))
+ !AMDGPU::isFlatGlobalAddrSpace(
+ PrintfFormatArgTy->getPointerAddressSpace()))
return false;
for (auto &U : PrintfFunction->uses()) {
>From e4779108b82c6ba028933fcce53fe584fc6dabd1 Mon Sep 17 00:00:00 2001
From: Steffen Holst Larsen <HolstLarsen.Steffen at amd.com>
Date: Mon, 26 Jan 2026 02:50:45 -0600
Subject: [PATCH 4/4] Make invalid signature test a single test file
Signed-off-by: Steffen Holst Larsen <HolstLarsen.Steffen at amd.com>
---
...encl-printf-invalid-first-arg-addrspace.ll | 50 ----
.../opencl-printf-invalid-first-arg-type.ll | 38 ---
.../AMDGPU/opencl-printf-invalid-return.ll | 52 ----
.../AMDGPU/opencl-printf-invalid-signature.ll | 244 ++++++++++++++++++
.../AMDGPU/opencl-printf-non-variadic.ll | 46 ----
.../AMDGPU/opencl-printf-too-many-args.ll | 52 ----
6 files changed, 244 insertions(+), 238 deletions(-)
delete mode 100644 llvm/test/CodeGen/AMDGPU/opencl-printf-invalid-first-arg-addrspace.ll
delete mode 100644 llvm/test/CodeGen/AMDGPU/opencl-printf-invalid-first-arg-type.ll
delete mode 100644 llvm/test/CodeGen/AMDGPU/opencl-printf-invalid-return.ll
create mode 100644 llvm/test/CodeGen/AMDGPU/opencl-printf-invalid-signature.ll
delete mode 100644 llvm/test/CodeGen/AMDGPU/opencl-printf-non-variadic.ll
delete mode 100644 llvm/test/CodeGen/AMDGPU/opencl-printf-too-many-args.ll
diff --git a/llvm/test/CodeGen/AMDGPU/opencl-printf-invalid-first-arg-addrspace.ll b/llvm/test/CodeGen/AMDGPU/opencl-printf-invalid-first-arg-addrspace.ll
deleted file mode 100644
index 2cc28da9b3607..0000000000000
--- a/llvm/test/CodeGen/AMDGPU/opencl-printf-invalid-first-arg-addrspace.ll
+++ /dev/null
@@ -1,50 +0,0 @@
-; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
-; RUN: opt -mtriple=r600-- -passes=amdgpu-printf-runtime-binding -mcpu=r600 -S < %s | FileCheck %s
-; RUN: opt -mtriple=amdgcn-- -passes=amdgpu-printf-runtime-binding -mcpu=fiji -S < %s | FileCheck %s
-; RUN: opt -mtriple=amdgcn--amdhsa -passes=amdgpu-printf-runtime-binding -mcpu=fiji -S < %s | FileCheck %s
-
-define amdgpu_kernel void @test_kernel(i32 %n) {
-; CHECK-LABEL: define amdgpu_kernel void @test_kernel(
-; CHECK-SAME: i32 [[N:%.*]]) #[[ATTR0:[0-9]+]] {
-; CHECK-NEXT: [[ENTRY:.*:]]
-; CHECK-NEXT: [[MEM:%.*]] = alloca i32, align 4, addrspace(5)
-; CHECK-NEXT: [[STR:%.*]] = alloca [9 x i8], align 1, addrspace(5)
-; CHECK-NEXT: [[CALL1:%.*]] = call i32 (ptr addrspace(5), ...) @printf(ptr addrspace(5) [[STR]], ptr addrspace(5) [[STR]], i32 [[N]])
-; CHECK-NEXT: store i32 [[CALL1]], ptr addrspace(5) [[MEM]], align 4
-; CHECK-NEXT: ret void
-;
-entry:
- %mem = alloca i32, align 4, addrspace(5)
- %str = alloca [9 x i8], align 1, addrspace(5)
- %call1 = call i32 (ptr addrspace(5), ...) @printf(ptr addrspace(5) %str, ptr addrspace(5) %str, i32 %n)
- store i32 %call1, ptr addrspace(5) %mem, align 4
- ret void
-}
-
-define i32 @test_func(i32 %n) {
-; CHECK-LABEL: define i32 @test_func(
-; CHECK-SAME: i32 [[N:%.*]]) #[[ATTR0]] {
-; CHECK-NEXT: [[ENTRY:.*:]]
-; CHECK-NEXT: [[STR:%.*]] = alloca [9 x i8], align 1, addrspace(5)
-; CHECK-NEXT: [[CALL1:%.*]] = call i32 (ptr addrspace(5), ...) @printf(ptr addrspace(5) [[STR]], ptr addrspace(5) [[STR]], i32 [[N]])
-; CHECK-NEXT: ret i32 [[CALL1]]
-;
-entry:
- %str = alloca [9 x i8], align 1, addrspace(5)
- %call1 = call i32 (ptr addrspace(5), ...) @printf(ptr addrspace(5) %str, ptr addrspace(5) %str, i32 %n)
- ret i32 %call1
-}
-
-define i32 @test_null_argument(i32 %n) {
-; CHECK-LABEL: define i32 @test_null_argument(
-; CHECK-SAME: i32 [[N:%.*]]) #[[ATTR0]] {
-; CHECK-NEXT: [[STR:%.*]] = alloca [9 x i8], align 1, addrspace(5)
-; CHECK-NEXT: [[CALL1:%.*]] = call i32 (ptr addrspace(5), ...) @printf(ptr addrspace(5) null, ptr addrspace(5) [[STR]], i32 [[N]])
-; CHECK-NEXT: ret i32 [[CALL1]]
-;
- %str = alloca [9 x i8], align 1, addrspace(5)
- %call1 = call i32 (ptr addrspace(5), ...) @printf(ptr addrspace(5) null, ptr addrspace(5) %str, i32 %n)
- ret i32 %call1
-}
-
-declare i32 @printf(ptr addrspace(5), ...)
diff --git a/llvm/test/CodeGen/AMDGPU/opencl-printf-invalid-first-arg-type.ll b/llvm/test/CodeGen/AMDGPU/opencl-printf-invalid-first-arg-type.ll
deleted file mode 100644
index fc00187c4a897..0000000000000
--- a/llvm/test/CodeGen/AMDGPU/opencl-printf-invalid-first-arg-type.ll
+++ /dev/null
@@ -1,38 +0,0 @@
-; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
-; RUN: opt -mtriple=r600-- -passes=amdgpu-printf-runtime-binding -mcpu=r600 -S < %s | FileCheck %s
-; RUN: opt -mtriple=amdgcn-- -passes=amdgpu-printf-runtime-binding -mcpu=fiji -S < %s | FileCheck %s
-; RUN: opt -mtriple=amdgcn--amdhsa -passes=amdgpu-printf-runtime-binding -mcpu=fiji -S < %s | FileCheck %s
-
-define amdgpu_kernel void @test_kernel(i32 %n) {
-; CHECK-LABEL: define amdgpu_kernel void @test_kernel(
-; CHECK-SAME: i32 [[N:%.*]]) #[[ATTR0:[0-9]+]] {
-; CHECK-NEXT: [[ENTRY:.*:]]
-; CHECK-NEXT: [[MEM:%.*]] = alloca float, align 4, addrspace(5)
-; CHECK-NEXT: [[STR:%.*]] = alloca [9 x i8], align 1, addrspace(5)
-; CHECK-NEXT: [[CALL1:%.*]] = call float (i32, ...) @printf(i32 [[N]], ptr addrspace(5) [[STR]], i32 [[N]])
-; CHECK-NEXT: store float [[CALL1]], ptr addrspace(5) [[MEM]], align 4
-; CHECK-NEXT: ret void
-;
-entry:
- %mem = alloca float, align 4, addrspace(5)
- %str = alloca [9 x i8], align 1, addrspace(5)
- %call1 = call float (i32, ...) @printf(i32 %n, ptr addrspace(5) %str, i32 %n)
- store float %call1, ptr addrspace(5) %mem, align 4
- ret void
-}
-
-define float @test_func(i32 %n) {
-; CHECK-LABEL: define float @test_func(
-; CHECK-SAME: i32 [[N:%.*]]) #[[ATTR0]] {
-; CHECK-NEXT: [[ENTRY:.*:]]
-; CHECK-NEXT: [[STR:%.*]] = alloca [9 x i8], align 1, addrspace(5)
-; CHECK-NEXT: [[CALL1:%.*]] = call float (i32, ...) @printf(i32 [[N]], ptr addrspace(5) [[STR]], i32 [[N]])
-; CHECK-NEXT: ret float [[CALL1]]
-;
-entry:
- %str = alloca [9 x i8], align 1, addrspace(5)
- %call1 = call float (i32, ...) @printf(i32 %n, ptr addrspace(5) %str, i32 %n)
- ret float %call1
-}
-
-declare float @printf(i32, ...)
diff --git a/llvm/test/CodeGen/AMDGPU/opencl-printf-invalid-return.ll b/llvm/test/CodeGen/AMDGPU/opencl-printf-invalid-return.ll
deleted file mode 100644
index 584aaf6ca99ad..0000000000000
--- a/llvm/test/CodeGen/AMDGPU/opencl-printf-invalid-return.ll
+++ /dev/null
@@ -1,52 +0,0 @@
-; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
-; RUN: opt -mtriple=r600-- -passes=amdgpu-printf-runtime-binding -mcpu=r600 -S < %s | FileCheck %s
-; RUN: opt -mtriple=amdgcn-- -passes=amdgpu-printf-runtime-binding -mcpu=fiji -S < %s | FileCheck %s
-; RUN: opt -mtriple=amdgcn--amdhsa -passes=amdgpu-printf-runtime-binding -mcpu=fiji -S < %s | FileCheck %s
-
- at .str = private unnamed_addr addrspace(4) constant [6 x i8] c"%s:%d\00", align 1
-
-define amdgpu_kernel void @test_kernel(i32 %n) {
-; CHECK-LABEL: define amdgpu_kernel void @test_kernel(
-; CHECK-SAME: i32 [[N:%.*]]) #[[ATTR0:[0-9]+]] {
-; CHECK-NEXT: [[ENTRY:.*:]]
-; CHECK-NEXT: [[MEM:%.*]] = alloca float, align 4, addrspace(5)
-; CHECK-NEXT: [[STR:%.*]] = alloca [9 x i8], align 1, addrspace(5)
-; CHECK-NEXT: [[CALL1:%.*]] = call float (ptr addrspace(4), ...) @printf(ptr addrspace(4) @.str, ptr addrspace(5) [[STR]], i32 [[N]])
-; CHECK-NEXT: store float [[CALL1]], ptr addrspace(5) [[MEM]], align 4
-; CHECK-NEXT: ret void
-;
-entry:
- %mem = alloca float, align 4, addrspace(5)
- %str = alloca [9 x i8], align 1, addrspace(5)
- %call1 = call float (ptr addrspace(4), ...) @printf(ptr addrspace(4) @.str, ptr addrspace(5) %str, i32 %n)
- store float %call1, ptr addrspace(5) %mem, align 4
- ret void
-}
-
-define float @test_func(i32 %n) {
-; CHECK-LABEL: define float @test_func(
-; CHECK-SAME: i32 [[N:%.*]]) #[[ATTR0]] {
-; CHECK-NEXT: [[ENTRY:.*:]]
-; CHECK-NEXT: [[STR:%.*]] = alloca [9 x i8], align 1, addrspace(5)
-; CHECK-NEXT: [[CALL1:%.*]] = call float (ptr addrspace(4), ...) @printf(ptr addrspace(4) @.str, ptr addrspace(5) [[STR]], i32 [[N]])
-; CHECK-NEXT: ret float [[CALL1]]
-;
-entry:
- %str = alloca [9 x i8], align 1, addrspace(5)
- %call1 = call float (ptr addrspace(4), ...) @printf(ptr addrspace(4) @.str, ptr addrspace(5) %str, i32 %n)
- ret float %call1
-}
-
-define float @test_null_argument(i32 %n) {
-; CHECK-LABEL: define float @test_null_argument(
-; CHECK-SAME: i32 [[N:%.*]]) #[[ATTR0]] {
-; CHECK-NEXT: [[STR:%.*]] = alloca [9 x i8], align 1, addrspace(5)
-; CHECK-NEXT: [[CALL1:%.*]] = call float (ptr addrspace(4), ...) @printf(ptr addrspace(4) null, ptr addrspace(5) [[STR]], i32 [[N]])
-; CHECK-NEXT: ret float [[CALL1]]
-;
- %str = alloca [9 x i8], align 1, addrspace(5)
- %call1 = call float (ptr addrspace(4), ...) @printf(ptr addrspace(4) null, ptr addrspace(5) %str, i32 %n)
- ret float %call1
-}
-
-declare float @printf(ptr addrspace(4), ...)
diff --git a/llvm/test/CodeGen/AMDGPU/opencl-printf-invalid-signature.ll b/llvm/test/CodeGen/AMDGPU/opencl-printf-invalid-signature.ll
new file mode 100644
index 0000000000000..707921d05c0b3
--- /dev/null
+++ b/llvm/test/CodeGen/AMDGPU/opencl-printf-invalid-signature.ll
@@ -0,0 +1,244 @@
+; RUN: split-file %s %t
+
+; RUN: opt -mtriple=r600-- -passes=amdgpu-printf-runtime-binding -mcpu=r600 -S < %t/invalid-first-arg-addrspace.ll | FileCheck %t/invalid-first-arg-addrspace.ll
+; RUN: opt -mtriple=amdgcn-- -passes=amdgpu-printf-runtime-binding -mcpu=fiji -S < %t/invalid-first-arg-addrspace.ll | FileCheck %t/invalid-first-arg-addrspace.ll
+; RUN: opt -mtriple=amdgcn--amdhsa -passes=amdgpu-printf-runtime-binding -mcpu=fiji -S < %t/invalid-first-arg-addrspace.ll | FileCheck %t/invalid-first-arg-addrspace.ll
+
+; RUN: opt -mtriple=r600-- -passes=amdgpu-printf-runtime-binding -mcpu=r600 -S < %t/invalid-first-arg-type.ll | FileCheck %t/invalid-first-arg-type.ll
+; RUN: opt -mtriple=amdgcn-- -passes=amdgpu-printf-runtime-binding -mcpu=fiji -S < %t/invalid-first-arg-type.ll | FileCheck %t/invalid-first-arg-type.ll
+; RUN: opt -mtriple=amdgcn--amdhsa -passes=amdgpu-printf-runtime-binding -mcpu=fiji -S < %t/invalid-first-arg-type.ll | FileCheck %t/invalid-first-arg-type.ll
+
+; RUN: opt -mtriple=r600-- -passes=amdgpu-printf-runtime-binding -mcpu=r600 -S < %t/invalid-return.ll | FileCheck %t/invalid-return.ll
+; RUN: opt -mtriple=amdgcn-- -passes=amdgpu-printf-runtime-binding -mcpu=fiji -S < %t/invalid-return.ll | FileCheck %t/invalid-return.ll
+; RUN: opt -mtriple=amdgcn--amdhsa -passes=amdgpu-printf-runtime-binding -mcpu=fiji -S < %t/invalid-return.ll | FileCheck %t/invalid-return.ll
+
+; RUN: opt -mtriple=r600-- -passes=amdgpu-printf-runtime-binding -mcpu=r600 -S < %t/non-variadic.ll | FileCheck %t/non-variadic.ll
+; RUN: opt -mtriple=amdgcn-- -passes=amdgpu-printf-runtime-binding -mcpu=fiji -S < %t/non-variadic.ll | FileCheck %t/non-variadic.ll
+; RUN: opt -mtriple=amdgcn--amdhsa -passes=amdgpu-printf-runtime-binding -mcpu=fiji -S < %t/non-variadic.ll | FileCheck %t/non-variadic.ll
+
+; RUN: opt -mtriple=r600-- -passes=amdgpu-printf-runtime-binding -mcpu=r600 -S < %t/too-many-args.ll | FileCheck %t/too-many-args.ll
+; RUN: opt -mtriple=amdgcn-- -passes=amdgpu-printf-runtime-binding -mcpu=fiji -S < %t/too-many-args.ll | FileCheck %t/too-many-args.ll
+; RUN: opt -mtriple=amdgcn--amdhsa -passes=amdgpu-printf-runtime-binding -mcpu=fiji -S < %t/too-many-args.ll | FileCheck %t/too-many-args.ll
+
+;--- invalid-first-arg-addrspace.ll
+define amdgpu_kernel void @test_kernel(i32 %n) {
+; CHECK-LABEL: define amdgpu_kernel void @test_kernel(
+; CHECK-SAME: i32 [[N:%.*]]) #[[ATTR0:[0-9]+]] {
+; CHECK-NEXT: [[ENTRY:.*:]]
+; CHECK-NEXT: [[MEM:%.*]] = alloca i32, align 4, addrspace(5)
+; CHECK-NEXT: [[STR:%.*]] = alloca [9 x i8], align 1, addrspace(5)
+; CHECK-NEXT: [[CALL1:%.*]] = call i32 (ptr addrspace(5), ...) @printf(ptr addrspace(5) [[STR]], ptr addrspace(5) [[STR]], i32 [[N]])
+; CHECK-NEXT: store i32 [[CALL1]], ptr addrspace(5) [[MEM]], align 4
+; CHECK-NEXT: ret void
+;
+entry:
+ %mem = alloca i32, align 4, addrspace(5)
+ %str = alloca [9 x i8], align 1, addrspace(5)
+ %call1 = call i32 (ptr addrspace(5), ...) @printf(ptr addrspace(5) %str, ptr addrspace(5) %str, i32 %n)
+ store i32 %call1, ptr addrspace(5) %mem, align 4
+ ret void
+}
+
+define i32 @test_func(i32 %n) {
+; CHECK-LABEL: define i32 @test_func(
+; CHECK-SAME: i32 [[N:%.*]]) #[[ATTR0]] {
+; CHECK-NEXT: [[ENTRY:.*:]]
+; CHECK-NEXT: [[STR:%.*]] = alloca [9 x i8], align 1, addrspace(5)
+; CHECK-NEXT: [[CALL1:%.*]] = call i32 (ptr addrspace(5), ...) @printf(ptr addrspace(5) [[STR]], ptr addrspace(5) [[STR]], i32 [[N]])
+; CHECK-NEXT: ret i32 [[CALL1]]
+;
+entry:
+ %str = alloca [9 x i8], align 1, addrspace(5)
+ %call1 = call i32 (ptr addrspace(5), ...) @printf(ptr addrspace(5) %str, ptr addrspace(5) %str, i32 %n)
+ ret i32 %call1
+}
+
+define i32 @test_null_argument(i32 %n) {
+; CHECK-LABEL: define i32 @test_null_argument(
+; CHECK-SAME: i32 [[N:%.*]]) #[[ATTR0]] {
+; CHECK-NEXT: [[STR:%.*]] = alloca [9 x i8], align 1, addrspace(5)
+; CHECK-NEXT: [[CALL1:%.*]] = call i32 (ptr addrspace(5), ...) @printf(ptr addrspace(5) null, ptr addrspace(5) [[STR]], i32 [[N]])
+; CHECK-NEXT: ret i32 [[CALL1]]
+;
+ %str = alloca [9 x i8], align 1, addrspace(5)
+ %call1 = call i32 (ptr addrspace(5), ...) @printf(ptr addrspace(5) null, ptr addrspace(5) %str, i32 %n)
+ ret i32 %call1
+}
+
+declare i32 @printf(ptr addrspace(5), ...)
+
+;--- invalid-first-arg-type.ll
+define amdgpu_kernel void @test_kernel(i32 %n) {
+; CHECK-LABEL: define amdgpu_kernel void @test_kernel(
+; CHECK-SAME: i32 [[N:%.*]]) #[[ATTR0:[0-9]+]] {
+; CHECK-NEXT: [[ENTRY:.*:]]
+; CHECK-NEXT: [[MEM:%.*]] = alloca float, align 4, addrspace(5)
+; CHECK-NEXT: [[STR:%.*]] = alloca [9 x i8], align 1, addrspace(5)
+; CHECK-NEXT: [[CALL1:%.*]] = call float (i32, ...) @printf(i32 [[N]], ptr addrspace(5) [[STR]], i32 [[N]])
+; CHECK-NEXT: store float [[CALL1]], ptr addrspace(5) [[MEM]], align 4
+; CHECK-NEXT: ret void
+;
+entry:
+ %mem = alloca float, align 4, addrspace(5)
+ %str = alloca [9 x i8], align 1, addrspace(5)
+ %call1 = call float (i32, ...) @printf(i32 %n, ptr addrspace(5) %str, i32 %n)
+ store float %call1, ptr addrspace(5) %mem, align 4
+ ret void
+}
+
+define float @test_func(i32 %n) {
+; CHECK-LABEL: define float @test_func(
+; CHECK-SAME: i32 [[N:%.*]]) #[[ATTR0]] {
+; CHECK-NEXT: [[ENTRY:.*:]]
+; CHECK-NEXT: [[STR:%.*]] = alloca [9 x i8], align 1, addrspace(5)
+; CHECK-NEXT: [[CALL1:%.*]] = call float (i32, ...) @printf(i32 [[N]], ptr addrspace(5) [[STR]], i32 [[N]])
+; CHECK-NEXT: ret float [[CALL1]]
+;
+entry:
+ %str = alloca [9 x i8], align 1, addrspace(5)
+ %call1 = call float (i32, ...) @printf(i32 %n, ptr addrspace(5) %str, i32 %n)
+ ret float %call1
+}
+
+declare float @printf(i32, ...)
+
+;--- invalid-return.ll
+ at .str = private unnamed_addr addrspace(4) constant [6 x i8] c"%s:%d\00", align 1
+
+define amdgpu_kernel void @test_kernel(i32 %n) {
+; CHECK-LABEL: define amdgpu_kernel void @test_kernel(
+; CHECK-SAME: i32 [[N:%.*]]) #[[ATTR0:[0-9]+]] {
+; CHECK-NEXT: [[ENTRY:.*:]]
+; CHECK-NEXT: [[MEM:%.*]] = alloca float, align 4, addrspace(5)
+; CHECK-NEXT: [[STR:%.*]] = alloca [9 x i8], align 1, addrspace(5)
+; CHECK-NEXT: [[CALL1:%.*]] = call float (ptr addrspace(4), ...) @printf(ptr addrspace(4) @.str, ptr addrspace(5) [[STR]], i32 [[N]])
+; CHECK-NEXT: store float [[CALL1]], ptr addrspace(5) [[MEM]], align 4
+; CHECK-NEXT: ret void
+;
+entry:
+ %mem = alloca float, align 4, addrspace(5)
+ %str = alloca [9 x i8], align 1, addrspace(5)
+ %call1 = call float (ptr addrspace(4), ...) @printf(ptr addrspace(4) @.str, ptr addrspace(5) %str, i32 %n)
+ store float %call1, ptr addrspace(5) %mem, align 4
+ ret void
+}
+
+define float @test_func(i32 %n) {
+; CHECK-LABEL: define float @test_func(
+; CHECK-SAME: i32 [[N:%.*]]) #[[ATTR0]] {
+; CHECK-NEXT: [[ENTRY:.*:]]
+; CHECK-NEXT: [[STR:%.*]] = alloca [9 x i8], align 1, addrspace(5)
+; CHECK-NEXT: [[CALL1:%.*]] = call float (ptr addrspace(4), ...) @printf(ptr addrspace(4) @.str, ptr addrspace(5) [[STR]], i32 [[N]])
+; CHECK-NEXT: ret float [[CALL1]]
+;
+entry:
+ %str = alloca [9 x i8], align 1, addrspace(5)
+ %call1 = call float (ptr addrspace(4), ...) @printf(ptr addrspace(4) @.str, ptr addrspace(5) %str, i32 %n)
+ ret float %call1
+}
+
+define float @test_null_argument(i32 %n) {
+; CHECK-LABEL: define float @test_null_argument(
+; CHECK-SAME: i32 [[N:%.*]]) #[[ATTR0]] {
+; CHECK-NEXT: [[STR:%.*]] = alloca [9 x i8], align 1, addrspace(5)
+; CHECK-NEXT: [[CALL1:%.*]] = call float (ptr addrspace(4), ...) @printf(ptr addrspace(4) null, ptr addrspace(5) [[STR]], i32 [[N]])
+; CHECK-NEXT: ret float [[CALL1]]
+;
+ %str = alloca [9 x i8], align 1, addrspace(5)
+ %call1 = call float (ptr addrspace(4), ...) @printf(ptr addrspace(4) null, ptr addrspace(5) %str, i32 %n)
+ ret float %call1
+}
+
+declare float @printf(ptr addrspace(4), ...)
+
+;--- non-variadic.ll
+ at .str = private unnamed_addr addrspace(4) constant [6 x i8] c"%s:%d\00", align 1
+
+define amdgpu_kernel void @test_kernel(i32 %n) {
+; CHECK-LABEL: define amdgpu_kernel void @test_kernel(
+; CHECK-SAME: i32 [[N:%.*]]) #[[ATTR0:[0-9]+]] {
+; CHECK-NEXT: [[ENTRY:.*:]]
+; CHECK-NEXT: [[MEM:%.*]] = alloca i32, align 4, addrspace(5)
+; CHECK-NEXT: [[CALL1:%.*]] = call i32 @printf(ptr addrspace(4) @.str, i32 [[N]])
+; CHECK-NEXT: store i32 [[CALL1]], ptr addrspace(5) [[MEM]], align 4
+; CHECK-NEXT: ret void
+;
+entry:
+ %mem = alloca i32, align 4, addrspace(5)
+ %call1 = call i32 (ptr addrspace(4), i32) @printf(ptr addrspace(4) @.str, i32 %n)
+ store i32 %call1, ptr addrspace(5) %mem, align 4
+ ret void
+}
+
+define i32 @test_func(i32 %n) {
+; CHECK-LABEL: define i32 @test_func(
+; CHECK-SAME: i32 [[N:%.*]]) #[[ATTR0]] {
+; CHECK-NEXT: [[ENTRY:.*:]]
+; CHECK-NEXT: [[CALL1:%.*]] = call i32 @printf(ptr addrspace(4) @.str, i32 [[N]])
+; CHECK-NEXT: ret i32 [[CALL1]]
+;
+entry:
+ %call1 = call i32 (ptr addrspace(4), i32) @printf(ptr addrspace(4) @.str, i32 %n)
+ ret i32 %call1
+}
+
+define i32 @test_null_argument(i32 %n) {
+; CHECK-LABEL: define i32 @test_null_argument(
+; CHECK-SAME: i32 [[N:%.*]]) #[[ATTR0]] {
+; CHECK-NEXT: [[CALL1:%.*]] = call i32 @printf(ptr addrspace(4) null, i32 [[N]])
+; CHECK-NEXT: ret i32 [[CALL1]]
+;
+ %call1 = call i32 (ptr addrspace(4), i32) @printf(ptr addrspace(4) null, i32 %n)
+ ret i32 %call1
+}
+
+declare i32 @printf(ptr addrspace(4), i32)
+
+;--- too-many-args.ll
+ at .str = private unnamed_addr addrspace(4) constant [6 x i8] c"%s:%d\00", align 1
+
+define amdgpu_kernel void @test_kernel(i32 %n) {
+; CHECK-LABEL: define amdgpu_kernel void @test_kernel(
+; CHECK-SAME: i32 [[N:%.*]]) #[[ATTR0:[0-9]+]] {
+; CHECK-NEXT: [[ENTRY:.*:]]
+; CHECK-NEXT: [[MEM:%.*]] = alloca float, align 4, addrspace(5)
+; CHECK-NEXT: [[STR:%.*]] = alloca [9 x i8], align 1, addrspace(5)
+; CHECK-NEXT: [[CALL1:%.*]] = call float (ptr addrspace(4), i32, ...) @printf(ptr addrspace(4) @.str, i32 [[N]], ptr addrspace(5) [[STR]], i32 [[N]])
+; CHECK-NEXT: store float [[CALL1]], ptr addrspace(5) [[MEM]], align 4
+; CHECK-NEXT: ret void
+;
+entry:
+ %mem = alloca float, align 4, addrspace(5)
+ %str = alloca [9 x i8], align 1, addrspace(5)
+ %call1 = call float (ptr addrspace(4), i32, ...) @printf(ptr addrspace(4) @.str, i32 %n, ptr addrspace(5) %str, i32 %n)
+ store float %call1, ptr addrspace(5) %mem, align 4
+ ret void
+}
+
+define float @test_func(i32 %n) {
+; CHECK-LABEL: define float @test_func(
+; CHECK-SAME: i32 [[N:%.*]]) #[[ATTR0]] {
+; CHECK-NEXT: [[ENTRY:.*:]]
+; CHECK-NEXT: [[STR:%.*]] = alloca [9 x i8], align 1, addrspace(5)
+; CHECK-NEXT: [[CALL1:%.*]] = call float (ptr addrspace(4), i32, ...) @printf(ptr addrspace(4) @.str, i32 [[N]], ptr addrspace(5) [[STR]], i32 [[N]])
+; CHECK-NEXT: ret float [[CALL1]]
+;
+entry:
+ %str = alloca [9 x i8], align 1, addrspace(5)
+ %call1 = call float (ptr addrspace(4), i32, ...) @printf(ptr addrspace(4) @.str, i32 %n, ptr addrspace(5) %str, i32 %n)
+ ret float %call1
+}
+
+define float @test_null_argument(i32 %n) {
+; CHECK-LABEL: define float @test_null_argument(
+; CHECK-SAME: i32 [[N:%.*]]) #[[ATTR0]] {
+; CHECK-NEXT: [[STR:%.*]] = alloca [9 x i8], align 1, addrspace(5)
+; CHECK-NEXT: [[CALL1:%.*]] = call float (ptr addrspace(4), i32, ...) @printf(ptr addrspace(4) null, i32 [[N]], ptr addrspace(5) [[STR]], i32 [[N]])
+; CHECK-NEXT: ret float [[CALL1]]
+;
+ %str = alloca [9 x i8], align 1, addrspace(5)
+ %call1 = call float (ptr addrspace(4), i32, ...) @printf(ptr addrspace(4) null, i32 %n, ptr addrspace(5) %str, i32 %n)
+ ret float %call1
+}
+
+declare float @printf(ptr addrspace(4), i32, ...)
diff --git a/llvm/test/CodeGen/AMDGPU/opencl-printf-non-variadic.ll b/llvm/test/CodeGen/AMDGPU/opencl-printf-non-variadic.ll
deleted file mode 100644
index 7380c097ecb8f..0000000000000
--- a/llvm/test/CodeGen/AMDGPU/opencl-printf-non-variadic.ll
+++ /dev/null
@@ -1,46 +0,0 @@
-; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
-; RUN: opt -mtriple=r600-- -passes=amdgpu-printf-runtime-binding -mcpu=r600 -S < %s | FileCheck %s
-; RUN: opt -mtriple=amdgcn-- -passes=amdgpu-printf-runtime-binding -mcpu=fiji -S < %s | FileCheck %s
-; RUN: opt -mtriple=amdgcn--amdhsa -passes=amdgpu-printf-runtime-binding -mcpu=fiji -S < %s | FileCheck %s
-
- at .str = private unnamed_addr addrspace(4) constant [6 x i8] c"%s:%d\00", align 1
-
-define amdgpu_kernel void @test_kernel(i32 %n) {
-; CHECK-LABEL: define amdgpu_kernel void @test_kernel(
-; CHECK-SAME: i32 [[N:%.*]]) #[[ATTR0:[0-9]+]] {
-; CHECK-NEXT: [[ENTRY:.*:]]
-; CHECK-NEXT: [[MEM:%.*]] = alloca i32, align 4, addrspace(5)
-; CHECK-NEXT: [[CALL1:%.*]] = call i32 @printf(ptr addrspace(4) @.str, i32 [[N]])
-; CHECK-NEXT: store i32 [[CALL1]], ptr addrspace(5) [[MEM]], align 4
-; CHECK-NEXT: ret void
-;
-entry:
- %mem = alloca i32, align 4, addrspace(5)
- %call1 = call i32 (ptr addrspace(4), i32) @printf(ptr addrspace(4) @.str, i32 %n)
- store i32 %call1, ptr addrspace(5) %mem, align 4
- ret void
-}
-
-define i32 @test_func(i32 %n) {
-; CHECK-LABEL: define i32 @test_func(
-; CHECK-SAME: i32 [[N:%.*]]) #[[ATTR0]] {
-; CHECK-NEXT: [[ENTRY:.*:]]
-; CHECK-NEXT: [[CALL1:%.*]] = call i32 @printf(ptr addrspace(4) @.str, i32 [[N]])
-; CHECK-NEXT: ret i32 [[CALL1]]
-;
-entry:
- %call1 = call i32 (ptr addrspace(4), i32) @printf(ptr addrspace(4) @.str, i32 %n)
- ret i32 %call1
-}
-
-define i32 @test_null_argument(i32 %n) {
-; CHECK-LABEL: define i32 @test_null_argument(
-; CHECK-SAME: i32 [[N:%.*]]) #[[ATTR0]] {
-; CHECK-NEXT: [[CALL1:%.*]] = call i32 @printf(ptr addrspace(4) null, i32 [[N]])
-; CHECK-NEXT: ret i32 [[CALL1]]
-;
- %call1 = call i32 (ptr addrspace(4), i32) @printf(ptr addrspace(4) null, i32 %n)
- ret i32 %call1
-}
-
-declare i32 @printf(ptr addrspace(4), i32)
diff --git a/llvm/test/CodeGen/AMDGPU/opencl-printf-too-many-args.ll b/llvm/test/CodeGen/AMDGPU/opencl-printf-too-many-args.ll
deleted file mode 100644
index ffed256a47491..0000000000000
--- a/llvm/test/CodeGen/AMDGPU/opencl-printf-too-many-args.ll
+++ /dev/null
@@ -1,52 +0,0 @@
-; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
-; RUN: opt -mtriple=r600-- -passes=amdgpu-printf-runtime-binding -mcpu=r600 -S < %s | FileCheck %s
-; RUN: opt -mtriple=amdgcn-- -passes=amdgpu-printf-runtime-binding -mcpu=fiji -S < %s | FileCheck %s
-; RUN: opt -mtriple=amdgcn--amdhsa -passes=amdgpu-printf-runtime-binding -mcpu=fiji -S < %s | FileCheck %s
-
- at .str = private unnamed_addr addrspace(4) constant [6 x i8] c"%s:%d\00", align 1
-
-define amdgpu_kernel void @test_kernel(i32 %n) {
-; CHECK-LABEL: define amdgpu_kernel void @test_kernel(
-; CHECK-SAME: i32 [[N:%.*]]) #[[ATTR0:[0-9]+]] {
-; CHECK-NEXT: [[ENTRY:.*:]]
-; CHECK-NEXT: [[MEM:%.*]] = alloca float, align 4, addrspace(5)
-; CHECK-NEXT: [[STR:%.*]] = alloca [9 x i8], align 1, addrspace(5)
-; CHECK-NEXT: [[CALL1:%.*]] = call float (ptr addrspace(4), i32, ...) @printf(ptr addrspace(4) @.str, i32 [[N]], ptr addrspace(5) [[STR]], i32 [[N]])
-; CHECK-NEXT: store float [[CALL1]], ptr addrspace(5) [[MEM]], align 4
-; CHECK-NEXT: ret void
-;
-entry:
- %mem = alloca float, align 4, addrspace(5)
- %str = alloca [9 x i8], align 1, addrspace(5)
- %call1 = call float (ptr addrspace(4), i32, ...) @printf(ptr addrspace(4) @.str, i32 %n, ptr addrspace(5) %str, i32 %n)
- store float %call1, ptr addrspace(5) %mem, align 4
- ret void
-}
-
-define float @test_func(i32 %n) {
-; CHECK-LABEL: define float @test_func(
-; CHECK-SAME: i32 [[N:%.*]]) #[[ATTR0]] {
-; CHECK-NEXT: [[ENTRY:.*:]]
-; CHECK-NEXT: [[STR:%.*]] = alloca [9 x i8], align 1, addrspace(5)
-; CHECK-NEXT: [[CALL1:%.*]] = call float (ptr addrspace(4), i32, ...) @printf(ptr addrspace(4) @.str, i32 [[N]], ptr addrspace(5) [[STR]], i32 [[N]])
-; CHECK-NEXT: ret float [[CALL1]]
-;
-entry:
- %str = alloca [9 x i8], align 1, addrspace(5)
- %call1 = call float (ptr addrspace(4), i32, ...) @printf(ptr addrspace(4) @.str, i32 %n, ptr addrspace(5) %str, i32 %n)
- ret float %call1
-}
-
-define float @test_null_argument(i32 %n) {
-; CHECK-LABEL: define float @test_null_argument(
-; CHECK-SAME: i32 [[N:%.*]]) #[[ATTR0]] {
-; CHECK-NEXT: [[STR:%.*]] = alloca [9 x i8], align 1, addrspace(5)
-; CHECK-NEXT: [[CALL1:%.*]] = call float (ptr addrspace(4), i32, ...) @printf(ptr addrspace(4) null, i32 [[N]], ptr addrspace(5) [[STR]], i32 [[N]])
-; CHECK-NEXT: ret float [[CALL1]]
-;
- %str = alloca [9 x i8], align 1, addrspace(5)
- %call1 = call float (ptr addrspace(4), i32, ...) @printf(ptr addrspace(4) null, i32 %n, ptr addrspace(5) %str, i32 %n)
- ret float %call1
-}
-
-declare float @printf(ptr addrspace(4), i32, ...)
More information about the llvm-commits
mailing list