summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2002-05-14 15:24:07 +0000
committerChris Lattner <sabre@nondot.org>2002-05-14 15:24:07 +0000
commit053c0939e31ddf587a407e7960d1c397f1a0bf96 (patch)
tree81e22836350f2928692f0cec6afdf21a9780d240 /llvm/lib/Transforms
parent9e36792753502b18741b74b12ff5e25465982a4d (diff)
downloadbcm5719-llvm-053c0939e31ddf587a407e7960d1c397f1a0bf96.tar.gz
bcm5719-llvm-053c0939e31ddf587a407e7960d1c397f1a0bf96.zip
Fix bug: test/Regression/Transforms/InstCombine/2002-05-14-TouchDeletedInst.ll
"This testcase caused instcombine to fail because it got the same instruction on it's worklist more than once (which is ok), but then deleted the instruction. Since the inst stayed on the worklist, as soon as it came back up to be processed, bad things happened, and opt asserted." llvm-svn: 2623
Diffstat (limited to 'llvm/lib/Transforms')
-rw-r--r--llvm/lib/Transforms/Scalar/InstructionCombining.cpp13
1 files changed, 12 insertions, 1 deletions
diff --git a/llvm/lib/Transforms/Scalar/InstructionCombining.cpp b/llvm/lib/Transforms/Scalar/InstructionCombining.cpp
index 0f676426e1b..0812fca6e97 100644
--- a/llvm/lib/Transforms/Scalar/InstructionCombining.cpp
+++ b/llvm/lib/Transforms/Scalar/InstructionCombining.cpp
@@ -26,6 +26,7 @@
#include "llvm/Support/InstIterator.h"
#include "llvm/Support/InstVisitor.h"
#include "Support/StatisticReporter.h"
+#include <algorithm>
static Statistic<> NumCombined("instcombine\t- Number of insts combined");
@@ -551,8 +552,18 @@ bool InstCombiner::runOnFunction(Function *F) {
if (Result) {
++NumCombined;
// Should we replace the old instruction with a new one?
- if (Result != I)
+ if (Result != I) {
+ // Instructions can end up on the worklist more than once. Make sure
+ // we do not process an instruction that has been deleted.
+ std::vector<Instruction*>::iterator It = std::find(WorkList.begin(),
+ WorkList.end(), I);
+ while (It != WorkList.end()) {
+ It = WorkList.erase(It);
+ It = std::find(It, WorkList.end(), I);
+ }
+
ReplaceInstWithInst(I, Result);
+ }
WorkList.push_back(Result);
AddUsesToWorkList(Result);
OpenPOWER on IntegriCloud