[llvm] [CodeGen] add a command to force global merge (PR #168231)
via llvm-commits
llvm-commits at lists.llvm.org
Sat Nov 15 11:50:32 PST 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-arm
Author: Austin (Zhenhang1213)
<details>
<summary>Changes</summary>
I've found that in certain performance scenarios, particularly with the -O2 this PR can significantly enhance the efficiency of loading global variables.
---
Full diff: https://github.com/llvm/llvm-project/pull/168231.diff
2 Files Affected:
- (modified) llvm/lib/CodeGen/GlobalMerge.cpp (+7-1)
- (added) llvm/test/CodeGen/ARM/force-global-merge.ll (+23)
``````````diff
diff --git a/llvm/lib/CodeGen/GlobalMerge.cpp b/llvm/lib/CodeGen/GlobalMerge.cpp
index e58d7e344c28b..ef7b1c758ff71 100644
--- a/llvm/lib/CodeGen/GlobalMerge.cpp
+++ b/llvm/lib/CodeGen/GlobalMerge.cpp
@@ -111,6 +111,11 @@ 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 +379,8 @@ 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
``````````
</details>
https://github.com/llvm/llvm-project/pull/168231
More information about the llvm-commits
mailing list