Change worklist driven deletion to be an iterative process.

Duncan noticed this!


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@138967 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Bill Wendling 2011-09-01 21:28:33 +00:00
parent 770e16fe17
commit c8c0fd3993
2 changed files with 12 additions and 42 deletions

View File

@ -1573,41 +1573,20 @@ bool InstCombiner::DoOneIteration(Function &F, unsigned Iteration) {
// the instcombine code from having to deal with some bad special cases.
for (Function::iterator BB = F.begin(), E = F.end(); BB != E; ++BB)
if (!Visited.count(BB)) {
Instruction *Term = BB->getTerminator();
if (isa<TerminatorInst>(BB->begin()))
continue;
// Delete the instructions backwards, as it has a reduced likelihood of
// having to update as many def-use and use-def chains.
std::vector<Instruction*> WorkList;
WorkList.reserve(BB->size());
BasicBlock::iterator I = Term; --I;
while (true) {
if (!I->getType()->isVoidTy())
I->replaceAllUsesWith(UndefValue::get(I->getType()));
WorkList.push_back(I);
if (I == BB->begin())
for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; ) {
Instruction *Inst = &*I++;
if (isa<TerminatorInst>(Inst))
break;
--I;
}
for (std::vector<Instruction*>::iterator
II = WorkList.begin(), IE = WorkList.end(); II != IE; ++II) {
Instruction *Inst = *II;
// Don't remove the landing pad. It should be removed only when its
// invokes are removed.
if (!Inst->use_empty())
Inst->replaceAllUsesWith(UndefValue::get(Inst->getType()));
if (isa<LandingPadInst>(Inst))
continue;
// A debug intrinsic shouldn't force another iteration if we weren't
// going to do one without it.
if (!isa<DbgInfoIntrinsic>(Inst)) {
++NumDeadInst;
MadeIRChange = true;
}
Inst->eraseFromParent();
}
}

View File

@ -1688,24 +1688,15 @@ static void DeleteInstructionInBlock(BasicBlock *BB) {
// Delete the instructions backwards, as it has a reduced likelihood of
// having to update as many def-use and use-def chains.
std::vector<Instruction*> WorkList;
WorkList.reserve(BB->size());
BasicBlock::iterator I = --BasicBlock::iterator(BB->getTerminator());
while (true) {
if (!I->use_empty())
I->replaceAllUsesWith(UndefValue::get(I->getType()));
WorkList.push_back(I);
if (I == BB->begin())
for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; ) {
Instruction *Inst = &*I++;
if (isa<TerminatorInst>(Inst))
break;
--I;
}
for (std::vector<Instruction*>::iterator
II = WorkList.begin(), IE = WorkList.end(); II != IE; ++II) {
if (isa<LandingPadInst>(*II))
if (!Inst->use_empty())
Inst->replaceAllUsesWith(UndefValue::get(Inst->getType()));
if (isa<LandingPadInst>(Inst))
continue;
BB->getInstList().erase(*II);
BB->getInstList().erase(Inst);
++NumInstRemoved;
}
}