mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-28 15:33:16 +00:00
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." git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@2623 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
0c131b6adf
commit
b3bc8fa755
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user