[llvm] [MergeFunc] Do not merge kernel functions (PR #174254)
Sebastian Neubauer via llvm-commits
llvm-commits at lists.llvm.org
Sat Jan 3 04:03:14 PST 2026
https://github.com/Flakebi updated https://github.com/llvm/llvm-project/pull/174254
>From ad0218a5af1eaad857e03529ea19ad744108405d Mon Sep 17 00:00:00 2001
From: Flakebi <flakebi at t-online.de>
Date: Sat, 3 Jan 2026 13:02:52 +0100
Subject: [PATCH] [IPO] Do not merge kernel functions
Kernels cannot be called, so we cannot introduce calls to them in
MergeFunctions.
---
llvm/lib/Transforms/IPO/MergeFunctions.cpp | 3 +
.../MergeFunc/merge-calling-conv.ll | 55 +++++++++++++++++++
2 files changed, 58 insertions(+)
create mode 100644 llvm/test/Transforms/MergeFunc/merge-calling-conv.ll
diff --git a/llvm/lib/Transforms/IPO/MergeFunctions.cpp b/llvm/lib/Transforms/IPO/MergeFunctions.cpp
index 0faa36a495acc..fcf3f7c89c711 100644
--- a/llvm/lib/Transforms/IPO/MergeFunctions.cpp
+++ b/llvm/lib/Transforms/IPO/MergeFunctions.cpp
@@ -697,6 +697,9 @@ static bool canCreateThunkFor(Function *F) {
if (F->isVarArg())
return false;
+ if (F->hasKernelCallingConv())
+ return false;
+
// Don't merge tiny functions using a thunk, since it can just end up
// making the function larger.
if (F->size() == 1) {
diff --git a/llvm/test/Transforms/MergeFunc/merge-calling-conv.ll b/llvm/test/Transforms/MergeFunc/merge-calling-conv.ll
new file mode 100644
index 0000000000000..192cf518a3cce
--- /dev/null
+++ b/llvm/test/Transforms/MergeFunc/merge-calling-conv.ll
@@ -0,0 +1,55 @@
+; RUN: opt -S -passes=mergefunc < %s | FileCheck --implicit-check-not=call %s
+
+; Check that no calls are generated for certain calling conventions
+
+ at debug = global i32 0
+
+; CHECK: call void @as_normal
+
+define void @normal(i32 %a) unnamed_addr {
+ %b = xor i32 %a, 0
+ store i32 %b, ptr @debug
+ ret void
+}
+
+define void @as_normal(i32 %a) unnamed_addr {
+ %b = xor i32 %a, 0
+ store i32 %b, ptr @debug
+ ret void
+}
+
+define amdgpu_kernel void @amdgpu_kernel(i32 %a) unnamed_addr {
+ %b = xor i32 %a, 1
+ store i32 %b, ptr @debug
+ ret void
+}
+
+define amdgpu_kernel void @as_amdgpu_kernel(i32 %a) unnamed_addr {
+ %b = xor i32 %a, 1
+ store i32 %b, ptr @debug
+ ret void
+}
+
+define ptx_kernel void @ptx_kernel(i32 %a) unnamed_addr {
+ %b = xor i32 %a, 2
+ store i32 %b, ptr @debug
+ ret void
+}
+
+define ptx_kernel void @as_ptx_kernel(i32 %a) unnamed_addr {
+ %b = xor i32 %a, 2
+ store i32 %b, ptr @debug
+ ret void
+}
+
+define spir_kernel void @spir_kernel(i32 %a) unnamed_addr {
+ %b = xor i32 %a, 3
+ store i32 %b, ptr @debug
+ ret void
+}
+
+define spir_kernel void @as_spir_kernel(i32 %a) unnamed_addr {
+ %b = xor i32 %a, 3
+ store i32 %b, ptr @debug
+ ret void
+}
More information about the llvm-commits
mailing list