Factor some code out of SimplifyCFG, forming a new

DeleteBlockIfDead method.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@60463 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2008-12-03 06:37:44 +00:00
parent 62c939d7d5
commit 2b1ba24fb7
3 changed files with 39 additions and 21 deletions

View File

@ -26,6 +26,11 @@ class Instruction;
class Pass;
class AliasAnalysis;
/// DeleteBlockIfDead - If the specified basic block is trivially dead (has no
/// predecessors and not the entry block), delete it and return true. Otherwise
/// return false.
bool DeleteBlockIfDead(BasicBlock *BB);
/// MergeBlockIntoPredecessor - Attempts to merge a block into its predecessor,
/// if possible. The return value indicates success or failure.
bool MergeBlockIntoPredecessor(BasicBlock* BB, Pass* P = 0);

View File

@ -24,6 +24,39 @@
#include <algorithm>
using namespace llvm;
/// DeleteBlockIfDead - If the specified basic block is trivially dead (has no
/// predecessors and not the entry block), delete it and return true. Otherwise
/// return false.
bool llvm::DeleteBlockIfDead(BasicBlock *BB) {
if (pred_begin(BB) != pred_end(BB) ||
BB == &BB->getParent()->getEntryBlock())
return false;
TerminatorInst *BBTerm = BB->getTerminator();
// Loop through all of our successors and make sure they know that one
// of their predecessors is going away.
for (unsigned i = 0, e = BBTerm->getNumSuccessors(); i != e; ++i)
BBTerm->getSuccessor(i)->removePredecessor(BB);
// Zap all the instructions in the block.
while (!BB->empty()) {
Instruction &I = BB->back();
// If this instruction is used, replace uses with an arbitrary value.
// Because control flow can't get here, we don't care what we replace the
// value with. Note that since this block is unreachable, and all values
// contained within it must dominate their uses, that all uses will
// eventually be removed (they are themselves dead).
if (!I.use_empty())
I.replaceAllUsesWith(UndefValue::get(I.getType()));
BB->getInstList().pop_back();
}
// Zap the block!
BB->eraseFromParent();
return true;
}
/// MergeBlockIntoPredecessor - Attempts to merge a block into its predecessor,
/// if possible. The return value indicates success or failure.
bool llvm::MergeBlockIntoPredecessor(BasicBlock* BB, Pass* P) {

View File

@ -1681,27 +1681,7 @@ bool llvm::SimplifyCFG(BasicBlock *BB) {
// as a predecessor. These are unreachable.
if (pred_begin(BB) == pred_end(BB) || BB->getSinglePredecessor() == BB) {
DOUT << "Removing BB: \n" << *BB;
// Loop through all of our successors and make sure they know that one
// of their predecessors is going away.
for (succ_iterator SI = succ_begin(BB), E = succ_end(BB); SI != E; ++SI)
SI->removePredecessor(BB);
while (!BB->empty()) {
Instruction &I = BB->back();
// If this instruction is used, replace uses with an arbitrary
// value. Because control flow can't get here, we don't care
// what we replace the value with. Note that since this block is
// unreachable, and all values contained within it must dominate their
// uses, that all uses will eventually be removed.
if (!I.use_empty())
// Make all users of this instruction use undef instead
I.replaceAllUsesWith(UndefValue::get(I.getType()));
// Remove the instruction from the basic block
BB->getInstList().pop_back();
}
BB->eraseFromParent();
DeleteBlockIfDead(BB);
return true;
}