[PATCH] D61947: [AArch64] Merge globals when optimising for size

Sjoerd Meijer via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Jun 11 09:11:37 PDT 2019


SjoerdMeijer updated this revision to Diff 204081.
SjoerdMeijer retitled this revision from "Merge of Global Constants not happening on Aarch64" to "[AArch64] Merge globals when optimising for size".
SjoerdMeijer added a comment.
Herald added a subscriber: hiraditya.
Herald added a project: LLVM.

I have enabled this only when we optimise for code-size. The performance results show that there's potential, but as pointed out there is this SPEC regression. But at the moment, we are interested in this patch for code size reasons, and it shows good improvements. I've left a FIXME that it would be worth investigating the regression so that it could be enabled for performance too in a follow up patch.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D61947/new/

https://reviews.llvm.org/D61947

Files:
  llvm/lib/Target/AArch64/AArch64TargetMachine.cpp
  llvm/test/CodeGen/AArch64/global-merge-minsize.ll


Index: llvm/test/CodeGen/AArch64/global-merge-minsize.ll
===================================================================
--- /dev/null
+++ llvm/test/CodeGen/AArch64/global-merge-minsize.ll
@@ -0,0 +1,21 @@
+; RUN: llc %s -o - -verify-machineinstrs | FileCheck %s
+
+target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
+target triple = "aarch64-arm-none-eabi"
+
+ at global0 = dso_local local_unnamed_addr global i32 0, align 4
+ at global1 = dso_local local_unnamed_addr global i32 0, align 4
+
+define dso_local i32 @func() minsize optsize {
+; CHECK-LABEL: @func
+; CHECK:       adrp x8, .L_MergedGlobals
+; CHECK-NEXT:  add x8, x8, :lo12:.L_MergedGlobals
+; CHECK-NEXT:  ldp w9, w8, [x8]
+; CHECK-NEXT:  add w0, w8, w9
+; CHECK-NEXT:  ret
+entry:
+  %0 = load i32, i32* @global0, align 4
+  %1 = load i32, i32* @global1, align 4
+  %add = add nsw i32 %1, %0
+  ret i32 %add
+}
Index: llvm/lib/Target/AArch64/AArch64TargetMachine.cpp
===================================================================
--- llvm/lib/Target/AArch64/AArch64TargetMachine.cpp
+++ llvm/lib/Target/AArch64/AArch64TargetMachine.cpp
@@ -462,7 +462,21 @@
       EnableGlobalMerge == cl::BOU_TRUE) {
     bool OnlyOptimizeForSize = (TM->getOptLevel() < CodeGenOpt::Aggressive) &&
                                (EnableGlobalMerge == cl::BOU_UNSET);
-    addPass(createGlobalMergePass(TM, 4095, 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();
+
+    // FIXME: global merging is only enabled when we optimise for size because
+    // with it also enabled for speed there is a performance regression in a
+    // popular benchmark.
+    if (!OnlyOptimizeForSize)
+      MergeExternalByDefault = false;
+
+    addPass(createGlobalMergePass(TM, 4095, OnlyOptimizeForSize,
+                                  MergeExternalByDefault));
   }
 
   return false;


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D61947.204081.patch
Type: text/x-patch
Size: 2190 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190611/2e9f8567/attachment.bin>


More information about the llvm-commits mailing list