From 25312b2b6c945e1cd236dc679b174114d96d840e Mon Sep 17 00:00:00 2001 From: David Green Date: Wed, 6 Jun 2018 14:48:32 +0000 Subject: [PATCH] [GlobalMerge] Set the alignment on merged global structs If no alignment is set, the abi/preferred alignment of structs will be used which may be higher than required. This can lead to extra padding and in the end an increase in data size. Differential Revision: https://reviews.llvm.org/D47633 llvm-svn: 334099 --- llvm/lib/CodeGen/GlobalMerge.cpp | 5 ++++ llvm/test/CodeGen/AArch64/global-merge-1.ll | 4 ++-- llvm/test/CodeGen/AArch64/global-merge-2.ll | 4 ++-- llvm/test/CodeGen/AArch64/global-merge-3.ll | 4 ++-- llvm/test/CodeGen/AArch64/global-merge-4.ll | 2 +- .../AArch64/global-merge-group-by-use.ll | 6 ++--- .../global-merge-ignore-single-use-minsize.ll | 2 +- .../AArch64/global-merge-ignore-single-use.ll | 2 +- llvm/test/CodeGen/ARM/global-merge-1.ll | 6 ++--- .../CodeGen/ARM/global-merge-alignment.ll | 24 +++++++++++++++++++ .../test/Transforms/GlobalMerge/debug-info.ll | 2 +- 11 files changed, 45 insertions(+), 16 deletions(-) create mode 100644 llvm/test/CodeGen/ARM/global-merge-alignment.ll diff --git a/llvm/lib/CodeGen/GlobalMerge.cpp b/llvm/lib/CodeGen/GlobalMerge.cpp index fbf94d2bb7fd..bebf1d6d4cd3 100644 --- a/llvm/lib/CodeGen/GlobalMerge.cpp +++ b/llvm/lib/CodeGen/GlobalMerge.cpp @@ -500,6 +500,11 @@ bool GlobalMerge::doMerge(const SmallVectorImpl &Globals, GlobalVariable::NotThreadLocal, AddrSpace); const StructLayout *MergedLayout = DL.getStructLayout(MergedTy); + // Set the alignment of the merged struct as the maximum alignment of the + // globals to prevent over-alignment. We don't handle globals that are not + // default aligned, so the alignment of the MergedLayout struct is + // equivalent. + MergedGV->setAlignment(MergedLayout->getAlignment()); for (ssize_t k = i, idx = 0; k != j; k = GlobalSet.find_next(k), ++idx) { GlobalValue::LinkageTypes Linkage = Globals[k]->getLinkage(); diff --git a/llvm/test/CodeGen/AArch64/global-merge-1.ll b/llvm/test/CodeGen/AArch64/global-merge-1.ll index e6ea6620881b..4b110baa18d4 100644 --- a/llvm/test/CodeGen/AArch64/global-merge-1.ll +++ b/llvm/test/CodeGen/AArch64/global-merge-1.ll @@ -22,10 +22,10 @@ define void @f1(i32 %a1, i32 %a2) { ;CHECK: .type .L_MergedGlobals,@object // @_MergedGlobals ;CHECK: .local .L_MergedGlobals -;CHECK: .comm .L_MergedGlobals,8,8 +;CHECK: .comm .L_MergedGlobals,8,4 ;CHECK: .set m, .L_MergedGlobals ;CHECK: .set n, .L_MergedGlobals+4 -;CHECK-APPLE-IOS: .zerofill __DATA,__bss,__MergedGlobals,8,3 ; @_MergedGlobals +;CHECK-APPLE-IOS: .zerofill __DATA,__bss,__MergedGlobals,8,2 ; @_MergedGlobals ;CHECK-APPLE-IOS-NOT: .set _m, l__MergedGlobals ;CHECK-APPLE-IOS-NOT: .set _n, l__MergedGlobals+4 diff --git a/llvm/test/CodeGen/AArch64/global-merge-2.ll b/llvm/test/CodeGen/AArch64/global-merge-2.ll index fdb29d26390f..42539767e6a4 100644 --- a/llvm/test/CodeGen/AArch64/global-merge-2.ll +++ b/llvm/test/CodeGen/AArch64/global-merge-2.ll @@ -29,7 +29,7 @@ define void @g1(i32 %a1, i32 %a2) { ;CHECK: .type .L_MergedGlobals,@object // @_MergedGlobals ;CHECK: .local .L_MergedGlobals -;CHECK: .comm .L_MergedGlobals,12,8 +;CHECK: .comm .L_MergedGlobals,12,4 ;CHECK: .globl x ;CHECK: .set x, .L_MergedGlobals @@ -41,7 +41,7 @@ define void @g1(i32 %a1, i32 %a2) { ;CHECK: .set z, .L_MergedGlobals+8 ;CHECK: .size z, 4 -;CHECK-APPLE-IOS: .zerofill __DATA,__common,__MergedGlobals_x,12,3 +;CHECK-APPLE-IOS: .zerofill __DATA,__common,__MergedGlobals_x,12,2 ;CHECK-APPLE-IOS: .globl _x ;CHECK-APPLE-IOS: .set {{.*}}, __MergedGlobals_x diff --git a/llvm/test/CodeGen/AArch64/global-merge-3.ll b/llvm/test/CodeGen/AArch64/global-merge-3.ll index d37dd863c799..98d2a1723a35 100644 --- a/llvm/test/CodeGen/AArch64/global-merge-3.ll +++ b/llvm/test/CodeGen/AArch64/global-merge-3.ll @@ -21,13 +21,13 @@ define void @f1(i32 %a1, i32 %a2, i32 %a3) { } ;CHECK: .type .L_MergedGlobals,@object // @_MergedGlobals -;CHECK: .p2align 4 +;CHECK: .p2align 2 ;CHECK: .L_MergedGlobals: ;CHECK: .size .L_MergedGlobals, 4004 ;CHECK-APPLE-IOS: .zerofill __DATA,__common,_y,4000,2 -;CHECK-APPLE-IOS: .p2align 4 +;CHECK-APPLE-IOS: .p2align 2 ;CHECK-APPLE-IOS: __MergedGlobals_x: ;CHECK-APPLE-IOS: .long 1 ;CHECK-APPLE-IOS: .space 4000 diff --git a/llvm/test/CodeGen/AArch64/global-merge-4.ll b/llvm/test/CodeGen/AArch64/global-merge-4.ll index 036b8910d66c..b03330f5d5c8 100644 --- a/llvm/test/CodeGen/AArch64/global-merge-4.ll +++ b/llvm/test/CodeGen/AArch64/global-merge-4.ll @@ -66,7 +66,7 @@ define internal i32* @returnFoo() #1 { ;CHECK: .type .L_MergedGlobals,@object // @_MergedGlobals ;CHECK: .local .L_MergedGlobals -;CHECK: .comm .L_MergedGlobals,60,16 +;CHECK: .comm .L_MergedGlobals,60,4 attributes #0 = { nounwind ssp } attributes #1 = { nounwind readnone ssp } diff --git a/llvm/test/CodeGen/AArch64/global-merge-group-by-use.ll b/llvm/test/CodeGen/AArch64/global-merge-group-by-use.ll index 86104b7285cf..99866c84b5ae 100644 --- a/llvm/test/CodeGen/AArch64/global-merge-group-by-use.ll +++ b/llvm/test/CodeGen/AArch64/global-merge-group-by-use.ll @@ -88,8 +88,8 @@ define void @f5(i32 %a1) #0 { ; CHECK-DAG: .zerofill __DATA,__bss,_o5,4,2 -; CHECK-DAG: .zerofill __DATA,__bss,[[SET1]],8,3 -; CHECK-DAG: .zerofill __DATA,__bss,[[SET2]],12,3 -; CHECK-DAG: .zerofill __DATA,__bss,[[SET3]],12,3 +; CHECK-DAG: .zerofill __DATA,__bss,[[SET1]],8,2 +; CHECK-DAG: .zerofill __DATA,__bss,[[SET2]],12,2 +; CHECK-DAG: .zerofill __DATA,__bss,[[SET3]],12,2 attributes #0 = { nounwind } diff --git a/llvm/test/CodeGen/AArch64/global-merge-ignore-single-use-minsize.ll b/llvm/test/CodeGen/AArch64/global-merge-ignore-single-use-minsize.ll index 8207f8cbef0d..8f5694afd5ed 100644 --- a/llvm/test/CodeGen/AArch64/global-merge-ignore-single-use-minsize.ll +++ b/llvm/test/CodeGen/AArch64/global-merge-ignore-single-use-minsize.ll @@ -67,7 +67,7 @@ define void @f4(i32 %a1, i32 %a2) nounwind { ret void } -; CHECK-DAG: .zerofill __DATA,__bss,[[SET]],16,3 +; CHECK-DAG: .zerofill __DATA,__bss,[[SET]],16,2 ; CHECK-DAG: .zerofill __DATA,__bss,_m2,4,2 ; CHECK-DAG: .zerofill __DATA,__bss,_n2,4,2 ; CHECK-DAG: .zerofill __DATA,__bss,_n4,4,2 diff --git a/llvm/test/CodeGen/AArch64/global-merge-ignore-single-use.ll b/llvm/test/CodeGen/AArch64/global-merge-ignore-single-use.ll index b3b8406b7639..be4adda59746 100644 --- a/llvm/test/CodeGen/AArch64/global-merge-ignore-single-use.ll +++ b/llvm/test/CodeGen/AArch64/global-merge-ignore-single-use.ll @@ -58,7 +58,7 @@ define void @f4(i32 %a1) #0 { ret void } -; CHECK-DAG: .zerofill __DATA,__bss,[[SET]],20,4 +; CHECK-DAG: .zerofill __DATA,__bss,[[SET]],20,2 ; CHECK-DAG: .zerofill __DATA,__bss,_o2,4,2 attributes #0 = { nounwind } diff --git a/llvm/test/CodeGen/ARM/global-merge-1.ll b/llvm/test/CodeGen/ARM/global-merge-1.ll index d4d9b0f9d1f3..67eec4b9cb04 100644 --- a/llvm/test/CodeGen/ARM/global-merge-1.ll +++ b/llvm/test/CodeGen/ARM/global-merge-1.ll @@ -11,16 +11,16 @@ ; MERGE-NOT: .zerofill __DATA,__bss,_bar,20,2 ; MERGE-NOT: .zerofill __DATA,__bss,_baz,20,2 ; MERGE-NOT: .zerofill __DATA,__bss,_foo,20,2 -; MERGE: .zerofill __DATA,__bss,__MergedGlobals,60,4 +; MERGE: .zerofill __DATA,__bss,__MergedGlobals,60,2 ; MERGE-NOT: .zerofill __DATA,__bss,_bar,20,2 ; MERGE-NOT: .zerofill __DATA,__bss,_baz,20,2 ; MERGE-NOT: .zerofill __DATA,__bss,_foo,20,2 -; NO-MERGE-NOT: .zerofill __DATA,__bss,__MergedGlobals,60,4 +; NO-MERGE-NOT: .zerofill __DATA,__bss,__MergedGlobals,60,2 ; NO-MERGE: .zerofill __DATA,__bss,_bar,20,2 ; NO-MERGE: .zerofill __DATA,__bss,_baz,20,2 ; NO-MERGE: .zerofill __DATA,__bss,_foo,20,2 -; NO-MERGE-NOT: .zerofill __DATA,__bss,__MergedGlobals,60,4 +; NO-MERGE-NOT: .zerofill __DATA,__bss,__MergedGlobals,60,2 target datalayout = "e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:32:64-v128:32:128-a0:0:32-n32-S32" target triple = "thumbv7-apple-ios3.0.0" diff --git a/llvm/test/CodeGen/ARM/global-merge-alignment.ll b/llvm/test/CodeGen/ARM/global-merge-alignment.ll new file mode 100644 index 000000000000..83e3c92fc089 --- /dev/null +++ b/llvm/test/CodeGen/ARM/global-merge-alignment.ll @@ -0,0 +1,24 @@ +; RUN: llc < %s -arm-global-merge -data-sections | FileCheck %s + +target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64" +target triple = "thumbv7em-arm-none-eabi" + +@f = local_unnamed_addr global [4 x i32*] zeroinitializer, align 4 +@d = local_unnamed_addr global i64 0, align 8 + +;CHECK: .section .bss..L_MergedGlobals,"aw",%nobits +;CHECK-NEXT: .p2align 3 +;CHECK-NEXT: .L_MergedGlobals: +;CHECK-NEXT: .zero 24 +;CHECK-NEXT: .size .L_MergedGlobals, 24 + + +define i32 @func_1() { + %1 = load i64, i64* @d, align 8 + %2 = load i32*, i32** getelementptr inbounds ([4 x i32*], [4 x i32*]* @f, i32 0, i32 0), align 4 + %3 = load i32, i32* %2, align 4 + %4 = trunc i64 %1 to i32 + %5 = add i32 %3, %4 + ret i32 %5 +} + diff --git a/llvm/test/Transforms/GlobalMerge/debug-info.ll b/llvm/test/Transforms/GlobalMerge/debug-info.ll index 2cea6f696c1c..f90b78c359e5 100644 --- a/llvm/test/Transforms/GlobalMerge/debug-info.ll +++ b/llvm/test/Transforms/GlobalMerge/debug-info.ll @@ -3,7 +3,7 @@ source_filename = "test/Transforms/GlobalMerge/debug-info.ll" target datalayout = "e-p:64:64" target triple = "x86_64-unknown-linux-gnu" -; CHECK: @_MergedGlobals = private global { i32, i32 } { i32 1, i32 2 }, !dbg [[A:![0-9]+]], !dbg [[B:![0-9]+]] +; CHECK: @_MergedGlobals = private global { i32, i32 } { i32 1, i32 2 }, align 4, !dbg [[A:![0-9]+]], !dbg [[B:![0-9]+]] @a = internal global i32 1, !dbg !0 @b = internal global i32 2, !dbg !2