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 (unsigned i = 0, e = C->getNumOperands(); i != e; ++i) { + if (!isNullOrUndef(cast(C->getOperand(i)))) + 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/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