[llvm] [CodeGen] add a command to force global merge (PR #168231)

via llvm-commits llvm-commits at lists.llvm.org
Sat Nov 15 11:54:44 PST 2025


https://github.com/Zhenhang1213 updated https://github.com/llvm/llvm-project/pull/168231

>From db5321b1910fb866ed8cb970993cd7f9ef3df697 Mon Sep 17 00:00:00 2001
From: Austin <zhenhangwang at huawei.com>
Date: Sun, 16 Nov 2025 03:49:16 +0800
Subject: [PATCH] [CodeGen] add a command to force global merge

I've found that in certain performance scenarios, particularly with the -O2  this PR can significantly enhance the efficiency of loading global variables.
---
 llvm/lib/CodeGen/GlobalMerge.cpp            | 10 ++++++++-
 llvm/test/CodeGen/ARM/force-global-merge.ll | 23 +++++++++++++++++++++
 2 files changed, 32 insertions(+), 1 deletion(-)
 create mode 100644 llvm/test/CodeGen/ARM/force-global-merge.ll

diff --git a/llvm/lib/CodeGen/GlobalMerge.cpp b/llvm/lib/CodeGen/GlobalMerge.cpp
index e58d7e344c28b..a65b1b6e2d346 100644
--- a/llvm/lib/CodeGen/GlobalMerge.cpp
+++ b/llvm/lib/CodeGen/GlobalMerge.cpp
@@ -111,6 +111,12 @@ EnableGlobalMerge("enable-global-merge", cl::Hidden,
                   cl::desc("Enable the global merge pass"),
                   cl::init(true));
 
+static cl::opt<bool>ForceEnableGlobalMerge(
+    "force-enable-global-merge", cl::Hidden,
+    cl::desc(
+        "Force enable the global merge, regardless of the optimization level"),
+    cl::init(false));
+
 static cl::opt<unsigned>
 GlobalMergeMaxOffset("global-merge-max-offset", cl::Hidden,
                      cl::desc("Set maximum offset for global merge pass"),
@@ -374,7 +380,9 @@ bool GlobalMergeImpl::doMerge(SmallVectorImpl<GlobalVariable *> &Globals,
         Function *ParentFn = I->getParent()->getParent();
 
         // If we're only optimizing for size, ignore non-minsize functions.
-        if (Opt.SizeOnly && !ParentFn->hasMinSize())
+        // And add a config to force global merge
+        if (!ForceEnableGlobalMerge
+            && (Opt.SizeOnly && !ParentFn->hasMinSize()))
           continue;
 
         size_t UGSIdx = GlobalUsesByFunction[ParentFn];
diff --git a/llvm/test/CodeGen/ARM/force-global-merge.ll b/llvm/test/CodeGen/ARM/force-global-merge.ll
new file mode 100644
index 0000000000000..a7b791dc0a634
--- /dev/null
+++ b/llvm/test/CodeGen/ARM/force-global-merge.ll
@@ -0,0 +1,23 @@
+; RUN: llc -mtriple=arm-eabi -force-enable-global-merge %s -o - | FileCheck %s
+
+ at g_value1 = dso_local local_unnamed_addr global i32 0, align 4
+ at g_value2 = dso_local local_unnamed_addr global i32 0, align 4
+ at g_value3 = dso_local local_unnamed_addr global i32 0, align 4
+ at g_value4 = dso_local local_unnamed_addr global i32 0, align 4
+
+define dso_local i32 @foo1() local_unnamed_addr {
+entry:
+  %0 = load i32, ptr @g_value1, align 4
+  %1 = load i32, ptr @g_value2, align 4
+  %2 = load i32, ptr @g_value3, align 4
+  %3 = load i32, ptr @g_value4, align 4
+  %call = tail call i32 @foo(i32 %0, i32 %1, i32 %2, i32 %3)
+  ret i32 %call
+}
+
+declare i32 @foo(i32, i32, i32, i32)
+
+; CHECK:      ldr     [[BASE:r[0-9]+]], .LCPI0_0
+; CHECK:      ldm     [[BASE]], {[[R0:r[0-9]+]], [[R1:r[0-9]+]], [[R2:r[0-9]+]], [[R3:r[0-9]+]]}
+; CHECK:      .LCPI0_0:
+; CHECK-NEXT: .long   .L_MergedGlobals



More information about the llvm-commits mailing list