Avoid deleting individual instructions until AFTER dead blocks have dropped

their references.  This fixes bug:
    test/Regression/Transforms/ADCE/2002-05-28-Crash*.ll

llvm-svn: 2753
This commit is contained in:
Chris Lattner 2002-05-28 21:38:16 +00:00
parent f19cdf8254
commit 779f966ce5

View File

@ -264,22 +264,12 @@ bool ADCE::doADCE() {
}
}
// Loop over all of the basic blocks in the function, removing dead
// instructions from alive blocks, and dropping references of the dead blocks
// Loop over all of the basic blocks in the function, dropping references of
// the dead basic blocks
//
for (Function::iterator I = Func->begin(), E = Func->end(); I != E; ++I) {
BasicBlock *BB = *I;
if (AliveBlocks.count(BB)) {
for (BasicBlock::iterator II = BB->begin(); II != BB->end()-1; )
if (!LiveSet.count(*II)) { // Is this instruction alive?
// Nope... remove the instruction from it's basic block...
delete BB->getInstList().remove(II);
++NumInstRemoved;
MadeChanges = true;
} else {
++II;
}
} else {
if (!AliveBlocks.count(BB)) {
// Remove all outgoing edges from this basic block and convert the
// terminator into a return instruction.
vector<BasicBlock*> Succs(succ_begin(BB), succ_end(BB));
@ -306,15 +296,28 @@ bool ADCE::doADCE() {
}
}
// Now loop through all of the blocks and delete them. We can safely do this
// now because we know that there are no references to dead blocks (because
// they have dropped all of their references...
// Now loop through all of the blocks and delete the dead ones. We can safely
// do this now because we know that there are no references to dead blocks
// (because they have dropped all of their references... we also remove dead
// instructions from alive blocks.
//
for (Function::iterator BI = Func->begin(); BI != Func->end(); )
if (!AliveBlocks.count(*BI))
delete Func->getBasicBlocks().remove(BI);
else
else {
BasicBlock *BB = *BI;
for (BasicBlock::iterator II = BB->begin(); II != BB->end()-1; )
if (!LiveSet.count(*II)) { // Is this instruction alive?
// Nope... remove the instruction from it's basic block...
delete BB->getInstList().remove(II);
++NumInstRemoved;
MadeChanges = true;
} else {
++II;
}
++BI; // Increment iterator...
}
return MadeChanges;
}