mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-23 05:29:23 +00:00
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:
parent
770e16fe17
commit
c8c0fd3993
@ -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();
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user