summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTeresa Johnson <tejohnson@google.com>2016-08-27 04:41:22 +0000
committerTeresa Johnson <tejohnson@google.com>2016-08-27 04:41:22 +0000
commite2e621a36c400f907e8a19545feffbcabfd66919 (patch)
tree02b952a5d38eeac4a1458068a1c73b9744886da6
parenta15ea4e217ddc4929f806eb27f49a61d9d6acc84 (diff)
downloadbcm5719-llvm-e2e621a36c400f907e8a19545feffbcabfd66919.tar.gz
bcm5719-llvm-e2e621a36c400f907e8a19545feffbcabfd66919.zip
[LTO] Don't create a new common unless merged has different size
Summary: This addresses a regression in common handling from the new LTO API in r278338. Only create a new common if the size is different. The type comparison against an array type fails when the size is different but not an array. GlobalMerge does not handle the array types as well and we lose some global merging opportunities. Reviewers: mehdi_amini Subscribers: junbuml, llvm-commits, mehdi_amini Differential Revision: https://reviews.llvm.org/D23955 llvm-svn: 279911
-rw-r--r--llvm/lib/LTO/LTO.cpp7
-rw-r--r--llvm/test/tools/gold/X86/common.ll6
-rw-r--r--llvm/test/tools/gold/X86/start-lib-common.ll2
3 files changed, 8 insertions, 7 deletions
diff --git a/llvm/lib/LTO/LTO.cpp b/llvm/lib/LTO/LTO.cpp
index 32bddbc8f1a..597cc0411d9 100644
--- a/llvm/lib/LTO/LTO.cpp
+++ b/llvm/lib/LTO/LTO.cpp
@@ -417,16 +417,17 @@ Error LTO::run(AddOutputFn AddOutput) {
Error LTO::runRegularLTO(AddOutputFn AddOutput) {
// Make sure commons have the right size/alignment: we kept the largest from
// all the prevailing when adding the inputs, and we apply it here.
+ const DataLayout &DL = RegularLTO.CombinedModule->getDataLayout();
for (auto &I : RegularLTO.Commons) {
- ArrayType *Ty =
- ArrayType::get(Type::getInt8Ty(RegularLTO.Ctx), I.second.Size);
GlobalVariable *OldGV = RegularLTO.CombinedModule->getNamedGlobal(I.first);
- if (OldGV && OldGV->getType()->getElementType() == Ty) {
+ if (OldGV && DL.getTypeAllocSize(OldGV->getValueType()) == I.second.Size) {
// Don't create a new global if the type is already correct, just make
// sure the alignment is correct.
OldGV->setAlignment(I.second.Align);
continue;
}
+ ArrayType *Ty =
+ ArrayType::get(Type::getInt8Ty(RegularLTO.Ctx), I.second.Size);
auto *GV = new GlobalVariable(*RegularLTO.CombinedModule, Ty, false,
GlobalValue::CommonLinkage,
ConstantAggregateZero::get(Ty), "");
diff --git a/llvm/test/tools/gold/X86/common.ll b/llvm/test/tools/gold/X86/common.ll
index d0c5f1873e0..25a889f8fd6 100644
--- a/llvm/test/tools/gold/X86/common.ll
+++ b/llvm/test/tools/gold/X86/common.ll
@@ -19,7 +19,7 @@
; RUN: llvm-dis %t3.o -o - | FileCheck %s --check-prefix=B
; (i16 align 8) + (i8 align 16) = i16 align 16
-; B: @a = common global [2 x i8] zeroinitializer, align 16
+; B: @a = common global i16 0, align 16
; RUN: %gold -plugin %llvmshlibdir/LLVMgold.so \
; RUN: --plugin-opt=emit-llvm \
@@ -27,7 +27,7 @@
; RUN: llvm-dis %t3.o -o - | FileCheck %s --check-prefix=C
; (i16 align 8) + (i8 align 1) = i16 align 8.
-; C: @a = common global [2 x i8] zeroinitializer, align 8
+; C: @a = common global i16 0, align 8
; RUN: %gold -plugin %llvmshlibdir/LLVMgold.so \
; RUN: --plugin-opt=emit-llvm \
@@ -44,4 +44,4 @@
; RUN: llvm-dis %t3.o -o - | FileCheck --check-prefix=MIXED %s
; Mixed ELF and IR. We keep ours as common so the linker will finish the merge.
-; MIXED: @a = common global [2 x i8] zeroinitializer, align 8
+; MIXED: @a = common global i16 0, align 8
diff --git a/llvm/test/tools/gold/X86/start-lib-common.ll b/llvm/test/tools/gold/X86/start-lib-common.ll
index 7c8945585a5..85222615d4a 100644
--- a/llvm/test/tools/gold/X86/start-lib-common.ll
+++ b/llvm/test/tools/gold/X86/start-lib-common.ll
@@ -19,4 +19,4 @@
; Check that the common symbol is not dropped completely, which was a regression
; in r262676.
-; CHECK: @x = common global [4 x i8] zeroinitializer
+; CHECK: @x = common global i32 0, align 8
OpenPOWER on IntegriCloud