mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-29 13:24:25 +00:00
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:
@ -26,6 +26,11 @@ class Instruction;
|
|||||||
class Pass;
|
class Pass;
|
||||||
class AliasAnalysis;
|
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,
|
/// MergeBlockIntoPredecessor - Attempts to merge a block into its predecessor,
|
||||||
/// if possible. The return value indicates success or failure.
|
/// if possible. The return value indicates success or failure.
|
||||||
bool MergeBlockIntoPredecessor(BasicBlock* BB, Pass* P = 0);
|
bool MergeBlockIntoPredecessor(BasicBlock* BB, Pass* P = 0);
|
||||||
|
@ -24,6 +24,39 @@
|
|||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
using namespace llvm;
|
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,
|
/// MergeBlockIntoPredecessor - Attempts to merge a block into its predecessor,
|
||||||
/// if possible. The return value indicates success or failure.
|
/// if possible. The return value indicates success or failure.
|
||||||
bool llvm::MergeBlockIntoPredecessor(BasicBlock* BB, Pass* P) {
|
bool llvm::MergeBlockIntoPredecessor(BasicBlock* BB, Pass* P) {
|
||||||
|
@ -1681,27 +1681,7 @@ bool llvm::SimplifyCFG(BasicBlock *BB) {
|
|||||||
// as a predecessor. These are unreachable.
|
// as a predecessor. These are unreachable.
|
||||||
if (pred_begin(BB) == pred_end(BB) || BB->getSinglePredecessor() == BB) {
|
if (pred_begin(BB) == pred_end(BB) || BB->getSinglePredecessor() == BB) {
|
||||||
DOUT << "Removing BB: \n" << *BB;
|
DOUT << "Removing BB: \n" << *BB;
|
||||||
|
DeleteBlockIfDead(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();
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user