From dfe52c56e3a45698570307a4e6876b562944dabe Mon Sep 17 00:00:00 2001 From: hstk30-hw 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 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 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 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