aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Transforms/Scalar/IndVarSimplify.cpp
diff options
context:
space:
mode:
authorBenjamin Kramer <benny.kra@googlemail.com>2012-10-19 17:53:54 +0000
committerBenjamin Kramer <benny.kra@googlemail.com>2012-10-19 17:53:54 +0000
commit7182126b0f3100cfddfbe6939be1a7eaeaf9fd57 (patch)
tree826a81a559510bbb9bfad69d680f5ba0af3cbf9a /lib/Transforms/Scalar/IndVarSimplify.cpp
parentde7c37efe2af87377ad3cdc707c61c0fa02c4038 (diff)
downloadexternal_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.cpp8
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) {