Index: lib/Target/TargetLoweringObjectFile.cpp =================================================================== --- lib/Target/TargetLoweringObjectFile.cpp +++ lib/Target/TargetLoweringObjectFile.cpp @@ -58,8 +58,16 @@ const Constant *C = GV->getInitializer(); // Must have zero initializer. - if (!C->isNullValue()) - return false; + if (!C->isNullValue() && !isa(C)) { + if (!isa(C)) + return false; + // Check that it isn't all zeros or undefs. + for (unsigned i = 0, e = C->getNumOperands(); i != e; ++i) { + Constant *E = cast(C->getOperand(i)); + if (!E->isNullValue() && !isa(E)) + return false; + } + } // Leave constant zeros in readonly constant sections, so they can be shared. if (GV->isConstant()) Index: test/CodeGen/X86/undef-globals-bss.ll =================================================================== --- /dev/null +++ test/CodeGen/X86/undef-globals-bss.ll @@ -0,0 +1,8 @@ +; 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,8000016,3 ## @struct +@struct = internal global { i1, [8000000 x i8], [7 x i8], i64 } { i1 false, [8000000 x i8] zeroinitializer, [7 x i8] undef, i64 0 }, align 8