Index: lib/Target/TargetLoweringObjectFile.cpp =================================================================== --- lib/Target/TargetLoweringObjectFile.cpp +++ lib/Target/TargetLoweringObjectFile.cpp @@ -54,11 +54,24 @@ delete Mang; } +static bool isNullOrUndef(const Constant *C) { + // Check that the constant isn't all zeros or undefs. + if (C->isNullValue() || isa(C)) + return true; + if (!isa(C)) + return false; + for (auto Operand : C->operand_values()) { + if (!isNullOrUndef(cast(Operand))) + return false; + } + return true; +} + static bool isSuitableForBSS(const GlobalVariable *GV, bool NoZerosInBSS) { const Constant *C = GV->getInitializer(); // Must have zero initializer. - if (!C->isNullValue()) + if (!isNullOrUndef(C)) return false; // Leave constant zeros in readonly constant sections, so they can be shared. Index: test/CodeGen/ARM/memfunc.ll =================================================================== --- test/CodeGen/ARM/memfunc.ll +++ test/CodeGen/ARM/memfunc.ll @@ -421,8 +421,8 @@ ; CHECK: arr5: ; CHECK-NOT: .p2align ; CHECK: arr6: -; CHECK: .p2align 4 -; CHECK: arr8: +; CHECK-NOT: .p2align +; CHECK: arr8 ; CHECK: .p2align 4 ; CHECK: arr9: Index: test/CodeGen/X86/undef-globals-bss.ll =================================================================== --- /dev/null +++ test/CodeGen/X86/undef-globals-bss.ll @@ -0,0 +1,12 @@ +; RUN: llc < %s | FileCheck %s +target triple = "x86_64-apple-darwin" + +; CHECK: .zerofill __DATA,__bss,_vals,8000000,2 ## @vals +@vals = internal unnamed_addr global [2000000 x i32] undef, align 4 + +; CHECK: .zerofill __DATA,__bss,_struct,8000040,3 ## @struct +@struct = internal global { i1, [8000000 x i8], [7 x i8], i64, { [4 x i32], { i8 }, i1 } } + { i1 false, [8000000 x i8] zeroinitializer, [7 x i8] undef, i64 0, + { [4 x i32], { i8 }, i1 } + { [4 x i32] zeroinitializer, { i8 } { i8 undef }, i1 false } + }, align 8