[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