From 9d0332f7b4d8aa8e07544506eb26d1e155c3745a Mon Sep 17 00:00:00 2001 From: Nick Lewycky Date: Wed, 6 Jun 2007 04:12:20 +0000 Subject: [PATCH] Fix PR1487 and Transforms/IndVar/2007-06-06-DeleteDanglesPtr.ll git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@37459 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Analysis/ScalarEvolution.cpp | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/lib/Analysis/ScalarEvolution.cpp b/lib/Analysis/ScalarEvolution.cpp index 1ff21a75f94..b1c3a177273 100644 --- a/lib/Analysis/ScalarEvolution.cpp +++ b/lib/Analysis/ScalarEvolution.cpp @@ -1196,9 +1196,28 @@ namespace { /// client before it removes an instruction from the program, to make sure /// that no dangling references are left around. void ScalarEvolutionsImpl::deleteInstructionFromRecords(Instruction *I) { - Scalars.erase(I); - if (PHINode *PN = dyn_cast(I)) - ConstantEvolutionLoopExitValue.erase(PN); + SmallVector Worklist; + + if (Scalars.erase(I)) { + if (PHINode *PN = dyn_cast(I)) + ConstantEvolutionLoopExitValue.erase(PN); + Worklist.push_back(I); + } + + while (!Worklist.empty()) { + Instruction *II = Worklist.back(); + Worklist.pop_back(); + + for (Instruction::use_iterator UI = II->use_begin(), UE = II->use_end(); + UI != UE; ++UI) { + Instruction *Inst = dyn_cast(*UI); + if (Inst && hasSCEV(Inst) && Scalars.erase(Inst)) { + if (PHINode *PN = dyn_cast(II)) + ConstantEvolutionLoopExitValue.erase(PN); + Worklist.push_back(Inst); + } + } + } }