Skip to content

Commit

Permalink
[ARM] Make GlobalMerge merge extern globals by default
Browse files Browse the repository at this point in the history
Enabling merging of extern globals appears to be generally either beneficial or
harmless. On some benchmarks suites (on Cortex-M4F, Cortex-A9, and Cortex-A57)
it gives improvements in the 1-5% range, but in the rest the overall effect is
zero.

Differential Revision: http://reviews.llvm.org/D10966


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@243874 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
john-brawn-arm committed Aug 3, 2015
1 parent 583fe8f commit d58af05
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 1 deletion.
8 changes: 7 additions & 1 deletion lib/Target/ARM/ARMTargetMachine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -348,7 +348,13 @@ bool ARMPassConfig::addPreISel() {
// tricky when doing code gen per function.
bool OnlyOptimizeForSize = (TM->getOptLevel() < CodeGenOpt::Aggressive) &&
(EnableGlobalMerge == cl::BOU_UNSET);
addPass(createGlobalMergePass(TM, 127, OnlyOptimizeForSize));
// Merging of extern globals is enabled by default on non-Mach-O as we
// expect it to be generally either beneficial or harmless. On Mach-O it
// is disabled as we emit the .subsections_via_symbols directive which
// means that merging extern globals is not safe.
bool MergeExternalByDefault = !TM->getTargetTriple().isOSBinFormatMachO();
addPass(createGlobalMergePass(TM, 127, OnlyOptimizeForSize,
MergeExternalByDefault));
}

return false;
Expand Down
48 changes: 48 additions & 0 deletions test/CodeGen/ARM/global-merge-external.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
; RUN: llc < %s -mtriple=arm-eabi -arm-global-merge | FileCheck %s --check-prefix=CHECK-MERGE
; RUN: llc < %s -mtriple=arm-eabi -arm-global-merge -global-merge-on-external=true | FileCheck %s --check-prefix=CHECK-MERGE
; RUN: llc < %s -mtriple=arm-eabi -arm-global-merge -global-merge-on-external=false | FileCheck %s --check-prefix=CHECK-NO-MERGE
; RUN: llc < %s -mtriple=arm-macho -arm-global-merge | FileCheck %s --check-prefix=CHECK-NO-MERGE

@x = global i32 0, align 4
@y = global i32 0, align 4
@z = global i32 0, align 4

define void @f1(i32 %a1, i32 %a2) {
;CHECK: f1:
;CHECK: ldr {{r[0-9]+}}, [[LABEL1:\.LCPI[0-9]+_[0-9]]]
;CHECK: [[LABEL1]]:
;CHECK-MERGE: .long _MergedGlobals_x
;CHECK-NO-MERGE: .long {{_?x}}
store i32 %a1, i32* @x, align 4
store i32 %a2, i32* @y, align 4
ret void
}

define void @g1(i32 %a1, i32 %a2) {
;CHECK: g1:
;CHECK: ldr {{r[0-9]+}}, [[LABEL2:\.LCPI[0-9]+_[0-9]]]
;CHECK: [[LABEL2]]:
;CHECK-MERGE: .long _MergedGlobals_x
;CHECK-NO-MERGE: .long {{_?y}}
store i32 %a1, i32* @y, align 4
store i32 %a2, i32* @z, align 4
ret void
}

;CHECK-NO-MERGE-NOT: .globl _MergedGlobals_x

;CHECK-MERGE: .type _MergedGlobals_x,%object
;CHECK-MERGE: .globl _MergedGlobals_x
;CHECK-MERGE: .align 2
;CHECK-MERGE: _MergedGlobals_x:
;CHECK-MERGE: .size _MergedGlobals_x, 12

;CHECK-MERGE: .globl x
;CHECK-MERGE: x = _MergedGlobals_x
;CHECK-MERGE: .size x, 4
;CHECK-MERGE: .globl y
;CHECK-MERGE: y = _MergedGlobals_x+4
;CHECK-MERGE: .size y, 4
;CHECK-MERGE: .globl z
;CHECK-MERGE: z = _MergedGlobals_x+8
;CHECK-MERGE: .size z, 4

0 comments on commit d58af05

Please sign in to comment.