[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