[llvm] [GlobalMerge]Prefer use global-merge-max-offset instead of the target-specific constant offset. (PR #165591)
via llvm-commits
llvm-commits at lists.llvm.org
Sat Nov 15 19:02:17 PST 2025
https://github.com/hstk30 updated https://github.com/llvm/llvm-project/pull/165591
>From dfe52c56e3a45698570307a4e6876b562944dabe Mon Sep 17 00:00:00 2001
From: hstk30-hw <hanwei62 at huawei.com>
Date: Wed, 29 Oct 2025 23:57:58 +0800
Subject: [PATCH 1/4] Prefer use global-merge-max-offset instead of the
target-specific constant offset.
In the Dhrystone benchmark, I find some adjacent global not be merged, on
the contrary the GCC's anchor optimize is work. Use
global-merge-max-offset to set the max offset can yield similar results
(still slightly different)
---
llvm/lib/CodeGen/GlobalMerge.cpp | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/llvm/lib/CodeGen/GlobalMerge.cpp b/llvm/lib/CodeGen/GlobalMerge.cpp
index e58d7e344c28b..3683cbe596eda 100644
--- a/llvm/lib/CodeGen/GlobalMerge.cpp
+++ b/llvm/lib/CodeGen/GlobalMerge.cpp
@@ -772,6 +772,7 @@ Pass *llvm::createGlobalMergePass(const TargetMachine *TM, unsigned Offset,
bool MergeConstAggressive = GlobalMergeAllConst.getNumOccurrences() > 0
? GlobalMergeAllConst
: MergeConstAggressiveByDefault;
- return new GlobalMerge(TM, Offset, OnlyOptimizeForSize, MergeExternal,
+ unsigned PreferOffset = GlobalMergeMaxOffset ? GlobalMergeMaxOffset : Offset;
+ return new GlobalMerge(TM, PerferOffset, OnlyOptimizeForSize, MergeExternal,
MergeConstant, MergeConstAggressive);
}
>From 504be520b629857ec3f37154a18a2ad815ed3b90 Mon Sep 17 00:00:00 2001
From: hstk30-hw <hanwei62 at huawei.com>
Date: Thu, 30 Oct 2025 09:41:21 +0800
Subject: [PATCH 2/4] Update GlobalMerge.cpp
---
llvm/lib/CodeGen/GlobalMerge.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/llvm/lib/CodeGen/GlobalMerge.cpp b/llvm/lib/CodeGen/GlobalMerge.cpp
index 3683cbe596eda..b0b249b54d6fe 100644
--- a/llvm/lib/CodeGen/GlobalMerge.cpp
+++ b/llvm/lib/CodeGen/GlobalMerge.cpp
@@ -773,6 +773,6 @@ Pass *llvm::createGlobalMergePass(const TargetMachine *TM, unsigned Offset,
? GlobalMergeAllConst
: MergeConstAggressiveByDefault;
unsigned PreferOffset = GlobalMergeMaxOffset ? GlobalMergeMaxOffset : Offset;
- return new GlobalMerge(TM, PerferOffset, OnlyOptimizeForSize, MergeExternal,
+ return new GlobalMerge(TM, PreferOffset, OnlyOptimizeForSize, MergeExternal,
MergeConstant, MergeConstAggressive);
}
>From 52c5f5b5bd3737988ebbbb7aaf31774bf3075a6c Mon Sep 17 00:00:00 2001
From: hstk30 <hanwei62 at huawei.com>
Date: Sun, 16 Nov 2025 00:20:52 +0800
Subject: [PATCH 3/4] add test cases for ARM and AArch64
---
llvm/lib/CodeGen/GlobalMerge.cpp | 10 ++--------
llvm/test/CodeGen/AArch64/global-merge.ll | 19 ++++++++++++-------
llvm/test/CodeGen/ARM/global-merge-1.ll | 1 +
3 files changed, 15 insertions(+), 15 deletions(-)
diff --git a/llvm/lib/CodeGen/GlobalMerge.cpp b/llvm/lib/CodeGen/GlobalMerge.cpp
index b0b249b54d6fe..0f398b375d799 100644
--- a/llvm/lib/CodeGen/GlobalMerge.cpp
+++ b/llvm/lib/CodeGen/GlobalMerge.cpp
@@ -196,13 +196,6 @@ class GlobalMerge : public FunctionPass {
public:
static char ID; // Pass identification, replacement for typeid.
- explicit GlobalMerge() : FunctionPass(ID) {
- Opt.MaxOffset = GlobalMergeMaxOffset;
- Opt.MergeConstantGlobals = EnableGlobalMergeOnConst;
- Opt.MergeConstAggressive = GlobalMergeAllConst;
- initializeGlobalMergePass(*PassRegistry::getPassRegistry());
- }
-
explicit GlobalMerge(const TargetMachine *TM, unsigned MaximalOffset,
bool OnlyOptimizeForSize, bool MergeExternalGlobals,
bool MergeConstantGlobals, bool MergeConstAggressive)
@@ -772,7 +765,8 @@ Pass *llvm::createGlobalMergePass(const TargetMachine *TM, unsigned Offset,
bool MergeConstAggressive = GlobalMergeAllConst.getNumOccurrences() > 0
? GlobalMergeAllConst
: MergeConstAggressiveByDefault;
- unsigned PreferOffset = GlobalMergeMaxOffset ? GlobalMergeMaxOffset : Offset;
+ unsigned PreferOffset = GlobalMergeMaxOffset.getNumOccurrences() > 0 ?
+ GlobalMergeMaxOffset : Offset;
return new GlobalMerge(TM, PreferOffset, OnlyOptimizeForSize, MergeExternal,
MergeConstant, MergeConstAggressive);
}
diff --git a/llvm/test/CodeGen/AArch64/global-merge.ll b/llvm/test/CodeGen/AArch64/global-merge.ll
index f2826e4cb00cb..723b033720937 100644
--- a/llvm/test/CodeGen/AArch64/global-merge.ll
+++ b/llvm/test/CodeGen/AArch64/global-merge.ll
@@ -1,17 +1,22 @@
; RUN: llc < %s -mtriple=aarch64-none-linux-gnu -O0 | FileCheck --check-prefix=NO-MERGE %s
+; RUN: llc < %s -mtriple=aarch64-none-linux-gnu -O1 | FileCheck --check-prefix=NO-MERGE %s
+; RUN: llc < %s -mtriple=aarch64-none-linux-gnu -O2 | FileCheck --check-prefix=NO-MERGE %s
+; RUN: llc < %s -mtriple=aarch64-none-linux-gnu -O3 | FileCheck %s
+; RUN: llc < %s -mtriple=aarch64-none-linux-gnu -O3 -global-merge-max-offset=0 | FileCheck %s --check-prefix=NO-MERGE
; RUN: llc < %s -mtriple=aarch64-none-linux-gnu -O0 -global-merge-on-external=true | FileCheck --check-prefix=NO-MERGE %s
; RUN: llc < %s -mtriple=aarch64-apple-ios -O0 | FileCheck %s --check-prefix=CHECK-APPLE-IOS-NO-MERGE
+; RUN: llc < %s -mtriple=aarch64-apple-ios -O1 | FileCheck %s --check-prefix=CHECK-APPLE-IOS-NO-MERGE
+; RUN: llc < %s -mtriple=aarch64-apple-ios -O2 | FileCheck %s --check-prefix=CHECK-APPLE-IOS-NO-MERGE
+; RUN: llc < %s -mtriple=aarch64-apple-ios -O3 | FileCheck %s --check-prefix=CHECK-APPLE-IOS
; RUN: llc < %s -mtriple=aarch64-apple-ios -O0 -global-merge-on-external=true | FileCheck %s --check-prefix=CHECK-APPLE-IOS-NO-MERGE
-; FIXME: add O1/O2 test for aarch64-none-linux-gnu and aarch64-apple-ios
-
@m = internal global i32 0, align 4
@n = internal global i32 0, align 4
define void @f1(i32 %a1, i32 %a2) {
; CHECK-LABEL: f1:
-; CHECK: adrp x{{[0-9]+}}, _MergedGlobals
+; CHECK: adrp x{{[0-9]+}}, .L_MergedGlobals
; CHECK-NOT: adrp
; CHECK-APPLE-IOS-LABEL: f1:
@@ -22,9 +27,9 @@ define void @f1(i32 %a1, i32 %a2) {
ret void
}
-; CHECK: .local _MergedGlobals
-; CHECK: .comm _MergedGlobals,8,8
+; CHECK: .local .L_MergedGlobals
+; CHECK: .comm .L_MergedGlobals,8,4
; NO-MERGE-NOT: .local _MergedGlobals
-; CHECK-APPLE-IOS: .zerofill __DATA,__bss,__MergedGlobals,8,3
-; CHECK-APPLE-IOS-NO-MERGE-NOT: .zerofill __DATA,__bss,__MergedGlobals,8,3
+; CHECK-APPLE-IOS: .zerofill __DATA,__bss,__MergedGlobals,8,2
+; CHECK-APPLE-IOS-NO-MERGE-NOT: .zerofill __DATA,__bss,__MergedGlobals,8,2
diff --git a/llvm/test/CodeGen/ARM/global-merge-1.ll b/llvm/test/CodeGen/ARM/global-merge-1.ll
index 05719ae4eb37d..fe42f7e54b192 100644
--- a/llvm/test/CodeGen/ARM/global-merge-1.ll
+++ b/llvm/test/CodeGen/ARM/global-merge-1.ll
@@ -7,6 +7,7 @@
; RUN: llc %s -O3 -o - | FileCheck -check-prefix=MERGE %s
; RUN: llc %s -O3 -o - -arm-global-merge=false | FileCheck -check-prefix=NO-MERGE %s
; RUN: llc %s -O3 -o - -arm-global-merge=true | FileCheck -check-prefix=MERGE %s
+; RUN: llc %s -O3 -o - -arm-global-merge=true -global-merge-max-offse=0 | FileCheck -check-prefix=NO-MERGE %s
; MERGE-NOT: .zerofill __DATA,__bss,_bar,20,2
; MERGE-NOT: .zerofill __DATA,__bss,_baz,20,2
>From 8e685124b547e1d7aa7ec6695015cd27ec495991 Mon Sep 17 00:00:00 2001
From: hstk30 <hanwei62 at huawei.com>
Date: Sun, 16 Nov 2025 11:01:43 +0800
Subject: [PATCH 4/4] fix format and testcases
---
llvm/lib/CodeGen/GlobalMerge.cpp | 12 ++++++++++--
llvm/test/CodeGen/ARM/global-merge-1.ll | 2 +-
2 files changed, 11 insertions(+), 3 deletions(-)
diff --git a/llvm/lib/CodeGen/GlobalMerge.cpp b/llvm/lib/CodeGen/GlobalMerge.cpp
index 0f398b375d799..b8b0d4d612742 100644
--- a/llvm/lib/CodeGen/GlobalMerge.cpp
+++ b/llvm/lib/CodeGen/GlobalMerge.cpp
@@ -196,6 +196,13 @@ class GlobalMerge : public FunctionPass {
public:
static char ID; // Pass identification, replacement for typeid.
+ explicit GlobalMerge() : FunctionPass(ID) {
+ Opt.MaxOffset = GlobalMergeMaxOffset;
+ Opt.MergeConstantGlobals = EnableGlobalMergeOnConst;
+ Opt.MergeConstAggressive = GlobalMergeAllConst;
+ initializeGlobalMergePass(*PassRegistry::getPassRegistry());
+ }
+
explicit GlobalMerge(const TargetMachine *TM, unsigned MaximalOffset,
bool OnlyOptimizeForSize, bool MergeExternalGlobals,
bool MergeConstantGlobals, bool MergeConstAggressive)
@@ -765,8 +772,9 @@ Pass *llvm::createGlobalMergePass(const TargetMachine *TM, unsigned Offset,
bool MergeConstAggressive = GlobalMergeAllConst.getNumOccurrences() > 0
? GlobalMergeAllConst
: MergeConstAggressiveByDefault;
- unsigned PreferOffset = GlobalMergeMaxOffset.getNumOccurrences() > 0 ?
- GlobalMergeMaxOffset : Offset;
+ unsigned PreferOffset = GlobalMergeMaxOffset.getNumOccurrences() > 0
+ ? GlobalMergeMaxOffset
+ : Offset;
return new GlobalMerge(TM, PreferOffset, OnlyOptimizeForSize, MergeExternal,
MergeConstant, MergeConstAggressive);
}
diff --git a/llvm/test/CodeGen/ARM/global-merge-1.ll b/llvm/test/CodeGen/ARM/global-merge-1.ll
index fe42f7e54b192..a6acdd5e58ed6 100644
--- a/llvm/test/CodeGen/ARM/global-merge-1.ll
+++ b/llvm/test/CodeGen/ARM/global-merge-1.ll
@@ -7,7 +7,7 @@
; RUN: llc %s -O3 -o - | FileCheck -check-prefix=MERGE %s
; RUN: llc %s -O3 -o - -arm-global-merge=false | FileCheck -check-prefix=NO-MERGE %s
; RUN: llc %s -O3 -o - -arm-global-merge=true | FileCheck -check-prefix=MERGE %s
-; RUN: llc %s -O3 -o - -arm-global-merge=true -global-merge-max-offse=0 | FileCheck -check-prefix=NO-MERGE %s
+; RUN: llc %s -O3 -o - -arm-global-merge=true -global-merge-max-offset=0 | FileCheck -check-prefix=NO-MERGE %s
; MERGE-NOT: .zerofill __DATA,__bss,_bar,20,2
; MERGE-NOT: .zerofill __DATA,__bss,_baz,20,2
More information about the llvm-commits
mailing list