forked from OSchip/llvm-project
CodeGen: When emitting stores for an initializer, only emit a GEP if we really need the store.
This avoids emitting many dead GEPs for large zero-initialized arrays. llvm-svn: 162701
This commit is contained in:
parent
71f611fbd6
commit
46cbe77b49
|
@ -719,10 +719,11 @@ static void emitStoresForInitAfterMemset(llvm::Constant *Init, llvm::Value *Loc,
|
|||
dyn_cast<llvm::ConstantDataSequential>(Init)) {
|
||||
for (unsigned i = 0, e = CDS->getNumElements(); i != e; ++i) {
|
||||
llvm::Constant *Elt = CDS->getElementAsConstant(i);
|
||||
|
||||
// Get a pointer to the element and emit it.
|
||||
emitStoresForInitAfterMemset(Elt, Builder.CreateConstGEP2_32(Loc, 0, i),
|
||||
isVolatile, Builder);
|
||||
|
||||
// If necessary, get a pointer to the element and emit it.
|
||||
if (!Elt->isNullValue() && !isa<llvm::UndefValue>(Elt))
|
||||
emitStoresForInitAfterMemset(Elt, Builder.CreateConstGEP2_32(Loc, 0, i),
|
||||
isVolatile, Builder);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
@ -732,9 +733,11 @@ static void emitStoresForInitAfterMemset(llvm::Constant *Init, llvm::Value *Loc,
|
|||
|
||||
for (unsigned i = 0, e = Init->getNumOperands(); i != e; ++i) {
|
||||
llvm::Constant *Elt = cast<llvm::Constant>(Init->getOperand(i));
|
||||
// Get a pointer to the element and emit it.
|
||||
emitStoresForInitAfterMemset(Elt, Builder.CreateConstGEP2_32(Loc, 0, i),
|
||||
isVolatile, Builder);
|
||||
|
||||
// If necessary, get a pointer to the element and emit it.
|
||||
if (!Elt->isNullValue() && !isa<llvm::UndefValue>(Elt))
|
||||
emitStoresForInitAfterMemset(Elt, Builder.CreateConstGEP2_32(Loc, 0, i),
|
||||
isVolatile, Builder);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -69,6 +69,8 @@ char test8(int X) {
|
|||
// CHECK: store i8 97
|
||||
// CHECK: store i8 98
|
||||
// CHECK: store i8 99
|
||||
// CHECK-NOT: getelementptr
|
||||
// CHECK: load
|
||||
}
|
||||
|
||||
void bar(void*);
|
||||
|
|
Loading…
Reference in New Issue