diff options
author | Dan Gohman <gohman@apple.com> | 2010-04-12 07:29:15 +0000 |
---|---|---|
committer | Dan Gohman <gohman@apple.com> | 2010-04-12 07:29:15 +0000 |
commit | dd842e34c8e133e3d36418c0d351034db52a05a7 (patch) | |
tree | 3a6bb47520bcdb0d3bcbbbece0d8a709289ae5f8 /lib/Transforms | |
parent | 09010a30fdb58426fc06c5c97956db35dcd90979 (diff) |
Use RecursivelyDeleteTriviallyDeadInstructions in EliminateIVComparisons,
instead of deleting just the user. This makes it more consistent with
other code in IndVarSimplify, and theoretically can eliminate more users
earlier.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@101027 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms')
-rw-r--r-- | lib/Transforms/Scalar/IndVarSimplify.cpp | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/lib/Transforms/Scalar/IndVarSimplify.cpp b/lib/Transforms/Scalar/IndVarSimplify.cpp index 5dbde99baa..e6e0129fa4 100644 --- a/lib/Transforms/Scalar/IndVarSimplify.cpp +++ b/lib/Transforms/Scalar/IndVarSimplify.cpp @@ -338,9 +338,11 @@ void IndVarSimplify::RewriteNonIntegerIVs(Loop *L) { } void IndVarSimplify::EliminateIVComparisons() { + SmallVector<WeakVH, 16> DeadInsts; + // Look for ICmp users. - for (IVUsers::iterator I = IU->begin(), E = IU->end(); I != E;) { - IVStrideUse &UI = *I++; + for (IVUsers::iterator I = IU->begin(), E = IU->end(); I != E; ++I) { + IVStrideUse &UI = *I; ICmpInst *ICmp = dyn_cast<ICmpInst>(UI.getUser()); if (!ICmp) continue; @@ -367,8 +369,15 @@ void IndVarSimplify::EliminateIVComparisons() { continue; DEBUG(dbgs() << "INDVARS: Eliminated comparison: " << *ICmp << '\n'); - ICmp->eraseFromParent(); + DeadInsts.push_back(ICmp); } + + // Now that we're done iterating through lists, clean up any instructions + // which are now dead. + while (!DeadInsts.empty()) + if (Instruction *Inst = + dyn_cast_or_null<Instruction>(DeadInsts.pop_back_val())) + RecursivelyDeleteTriviallyDeadInstructions(Inst); } bool IndVarSimplify::runOnLoop(Loop *L, LPPassManager &LPM) { |