diff options
author | Chandler Carruth <chandlerc@gmail.com> | 2014-05-03 09:16:57 +0000 |
---|---|---|
committer | Chandler Carruth <chandlerc@gmail.com> | 2014-05-03 09:16:57 +0000 |
commit | e6c980c41d68fe4251c79479d6111c910e88c87f (patch) | |
tree | 2cd87f2d0619da8398d155800e8fa588abc483f0 /clang/lib/CodeGen | |
parent | 81f9e02ef3c41caa1ff085156f31c9e963b4ce7e (diff) | |
download | bcm5719-llvm-e6c980c41d68fe4251c79479d6111c910e88c87f.tar.gz bcm5719-llvm-e6c980c41d68fe4251c79479d6111c910e88c87f.zip |
[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
Diffstat (limited to 'clang/lib/CodeGen')
-rw-r--r-- | clang/lib/CodeGen/CGExprCXX.cpp | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/clang/lib/CodeGen/CGExprCXX.cpp b/clang/lib/CodeGen/CGExprCXX.cpp index f71a3debe2a..3a116062b82 100644 --- a/clang/lib/CodeGen/CGExprCXX.cpp +++ b/clang/lib/CodeGen/CGExprCXX.cpp @@ -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"); |