diff options
author | Benjamin Kramer <benny.kra@googlemail.com> | 2012-10-19 17:53:54 +0000 |
---|---|---|
committer | Benjamin Kramer <benny.kra@googlemail.com> | 2012-10-19 17:53:54 +0000 |
commit | 7182126b0f3100cfddfbe6939be1a7eaeaf9fd57 (patch) | |
tree | 826a81a559510bbb9bfad69d680f5ba0af3cbf9a /lib/Transforms/Scalar/IndVarSimplify.cpp | |
parent | de7c37efe2af87377ad3cdc707c61c0fa02c4038 (diff) | |
download | external_llvm-7182126b0f3100cfddfbe6939be1a7eaeaf9fd57.zip external_llvm-7182126b0f3100cfddfbe6939be1a7eaeaf9fd57.tar.gz external_llvm-7182126b0f3100cfddfbe6939be1a7eaeaf9fd57.tar.bz2 |
Indvars: Don't recursively delete instruction during BB iteration.
This can invalidate the iterators leading to use after frees and crashes.
Fixes PR12536.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@166291 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/Scalar/IndVarSimplify.cpp')
-rw-r--r-- | lib/Transforms/Scalar/IndVarSimplify.cpp | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/lib/Transforms/Scalar/IndVarSimplify.cpp b/lib/Transforms/Scalar/IndVarSimplify.cpp index 78630b2..82eb746 100644 --- a/lib/Transforms/Scalar/IndVarSimplify.cpp +++ b/lib/Transforms/Scalar/IndVarSimplify.cpp @@ -551,15 +551,17 @@ void IndVarSimplify::RewriteLoopExitValues(Loop *L, SCEVExpander &Rewriter) { PN->setIncomingValue(i, ExitVal); - // If this instruction is dead now, delete it. - RecursivelyDeleteTriviallyDeadInstructions(Inst, TLI); + // If this instruction is dead now, delete it. Don't do it now to avoid + // invalidating iterators. + if (isInstructionTriviallyDead(Inst, TLI)) + DeadInsts.push_back(Inst); if (NumPreds == 1) { // Completely replace a single-pred PHI. This is safe, because the // NewVal won't be variant in the loop, so we don't need an LCSSA phi // node anymore. PN->replaceAllUsesWith(ExitVal); - RecursivelyDeleteTriviallyDeadInstructions(PN, TLI); + PN->eraseFromParent(); } } if (NumPreds != 1) { |