[leaks] Re-shuffle code such that we don't create a basic block for

initializing an array unless we need it. Specifically, position the
creation of a new basic block after we've checked all of the cases that
bypass the need for it.

Fixes another leak in test/CodeGen* found by LSan.

llvm-svn: 207900
This commit is contained in:
Chandler Carruth 2014-05-03 09:16:57 +00:00
parent 81f9e02ef3
commit e6c980c41d
1 changed files with 11 additions and 9 deletions

View File

@ -814,20 +814,22 @@ CodeGenFunction::EmitNewArrayInitializer(const CXXNewExpr *E,
explicitPtr = Builder.CreateBitCast(explicitPtr, beginPtr->getType());
}
llvm::ConstantInt *constNum = dyn_cast<llvm::ConstantInt>(numElements);
// If all elements have already been initialized, skip the whole loop.
if (constNum && constNum->getZExtValue() <= initializerElements) {
// If there was a cleanup, deactivate it.
if (cleanupDominator)
DeactivateCleanupBlock(cleanup, cleanupDominator);
return;
}
// Create the continuation block.
llvm::BasicBlock *contBB = createBasicBlock("new.loop.end");
// If the number of elements isn't constant, we have to now check if there is
// anything left to initialize.
if (llvm::ConstantInt *constNum = dyn_cast<llvm::ConstantInt>(numElements)) {
// If all elements have already been initialized, skip the whole loop.
if (constNum->getZExtValue() <= initializerElements) {
// If there was a cleanup, deactivate it.
if (cleanupDominator)
DeactivateCleanupBlock(cleanup, cleanupDominator);
return;
}
} else {
if (!constNum) {
llvm::BasicBlock *nonEmptyBB = createBasicBlock("new.loop.nonempty");
llvm::Value *isEmpty = Builder.CreateICmpEQ(explicitPtr, endPtr,
"array.isempty");