mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-08 21:32:39 +00:00
Resubmit with fix. Properly remove the instructions except for landingpad, which should be removed only when its invokes are.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@138932 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
c1b4cd6c11
commit
a8d1393093
@ -1574,22 +1574,41 @@ bool InstCombiner::DoOneIteration(Function &F, unsigned Iteration) {
|
|||||||
for (Function::iterator BB = F.begin(), E = F.end(); BB != E; ++BB)
|
for (Function::iterator BB = F.begin(), E = F.end(); BB != E; ++BB)
|
||||||
if (!Visited.count(BB)) {
|
if (!Visited.count(BB)) {
|
||||||
Instruction *Term = BB->getTerminator();
|
Instruction *Term = BB->getTerminator();
|
||||||
while (Term != BB->begin()) { // Remove instrs bottom-up
|
|
||||||
BasicBlock::iterator I = Term; --I;
|
|
||||||
|
|
||||||
DEBUG(errs() << "IC: DCE: " << *I << '\n');
|
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())
|
||||||
|
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 (isa<LandingPadInst>(Inst))
|
||||||
|
continue;
|
||||||
|
|
||||||
// A debug intrinsic shouldn't force another iteration if we weren't
|
// A debug intrinsic shouldn't force another iteration if we weren't
|
||||||
// going to do one without it.
|
// going to do one without it.
|
||||||
if (!isa<DbgInfoIntrinsic>(I)) {
|
if (!isa<DbgInfoIntrinsic>(Inst)) {
|
||||||
++NumDeadInst;
|
++NumDeadInst;
|
||||||
MadeIRChange = true;
|
MadeIRChange = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// If I is not void type then replaceAllUsesWith undef.
|
Inst->eraseFromParent();
|
||||||
// This allows ValueHandlers and custom metadata to adjust itself.
|
|
||||||
if (!I->getType()->isVoidTy())
|
|
||||||
I->replaceAllUsesWith(UndefValue::get(I->getType()));
|
|
||||||
I->eraseFromParent();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user