[llvm] 4d66ccc - [MergeFunc] Do not merge kernel functions (#174254)

via llvm-commits llvm-commits at lists.llvm.org
Sun Jan 4 04:35:21 PST 2026


Author: Sebastian Neubauer
Date: 2026-01-04T13:35:16+01:00
New Revision: 4d66cccffe179d0d2bbec833ace041349cf872a4

URL: https://github.com/llvm/llvm-project/commit/4d66cccffe179d0d2bbec833ace041349cf872a4
DIFF: https://github.com/llvm/llvm-project/commit/4d66cccffe179d0d2bbec833ace041349cf872a4.diff

LOG: [MergeFunc] Do not merge kernel functions (#174254)

Kernels cannot be called, so we cannot introduce calls to them in
MergeFunctions.

The test uses a `--implicit-check-not=call` to make sure that only the
function with C calling convention gets merged.

Fixes #39579. Fixes #173355.

Added: 
    llvm/test/Transforms/MergeFunc/merge-calling-conv.ll

Modified: 
    llvm/lib/Transforms/IPO/MergeFunctions.cpp

Removed: 
    


################################################################################
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