mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-04-06 01:31:56 +00:00
move MergeBasicBlockIntoOnlyPred to Transforms/Utils.
llvm-svn: 60162
This commit is contained in:
parent
7742719284
commit
bb86dff3fe
@ -62,6 +62,14 @@ bool dceInstruction(BasicBlock::iterator &BBI);
|
|||||||
// Control Flow Graph Restructuring...
|
// Control Flow Graph Restructuring...
|
||||||
//
|
//
|
||||||
|
|
||||||
|
/// MergeBasicBlockIntoOnlyPred - BB is a block with one predecessor and its
|
||||||
|
/// predecessor is known to have one successor (BB!). Eliminate the edge
|
||||||
|
/// between them, moving the instructions in the predecessor into BB. This
|
||||||
|
/// deletes the predecessor block.
|
||||||
|
///
|
||||||
|
void MergeBasicBlockIntoOnlyPred(BasicBlock *BB);
|
||||||
|
|
||||||
|
|
||||||
/// SimplifyCFG - This function is used to do simplification of a CFG. For
|
/// SimplifyCFG - This function is used to do simplification of a CFG. For
|
||||||
/// example, it adjusts branches to branches to eliminate the extra hop, it
|
/// example, it adjusts branches to branches to eliminate the extra hop, it
|
||||||
/// eliminates unreachable basic blocks, and does other "peephole" optimization
|
/// eliminates unreachable basic blocks, and does other "peephole" optimization
|
||||||
|
@ -156,37 +156,6 @@ static unsigned getJumpThreadDuplicationCost(const BasicBlock *BB) {
|
|||||||
return Size;
|
return Size;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// MergeBasicBlockIntoOnlyPred - DestBB is a block with one predecessor and its
|
|
||||||
/// predecessor is known to have one successor (DestBB!). Eliminate the edge
|
|
||||||
/// between them, moving the instructions in the predecessor into DestBB and
|
|
||||||
/// deleting the predecessor block.
|
|
||||||
///
|
|
||||||
/// FIXME: Move to TransformUtils to share with simplifycfg and codegenprepare.
|
|
||||||
static void MergeBasicBlockIntoOnlyPred(BasicBlock *DestBB) {
|
|
||||||
// If BB has single-entry PHI nodes, fold them.
|
|
||||||
while (PHINode *PN = dyn_cast<PHINode>(DestBB->begin())) {
|
|
||||||
Value *NewVal = PN->getIncomingValue(0);
|
|
||||||
// Replace self referencing PHI with undef, it must be dead.
|
|
||||||
if (NewVal == PN) NewVal = UndefValue::get(PN->getType());
|
|
||||||
PN->replaceAllUsesWith(NewVal);
|
|
||||||
PN->eraseFromParent();
|
|
||||||
}
|
|
||||||
|
|
||||||
BasicBlock *PredBB = DestBB->getSinglePredecessor();
|
|
||||||
assert(PredBB && "Block doesn't have a single predecessor!");
|
|
||||||
|
|
||||||
// Splice all the instructions from PredBB to DestBB.
|
|
||||||
PredBB->getTerminator()->eraseFromParent();
|
|
||||||
DestBB->getInstList().splice(DestBB->begin(), PredBB->getInstList());
|
|
||||||
|
|
||||||
// Anything that branched to PredBB now branches to DestBB.
|
|
||||||
PredBB->replaceAllUsesWith(DestBB);
|
|
||||||
|
|
||||||
// Nuke BB.
|
|
||||||
PredBB->eraseFromParent();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/// ProcessBlock - If there are any predecessors whose control can be threaded
|
/// ProcessBlock - If there are any predecessors whose control can be threaded
|
||||||
/// through to a successor, transform them now.
|
/// through to a successor, transform them now.
|
||||||
bool JumpThreading::ProcessBlock(BasicBlock *BB) {
|
bool JumpThreading::ProcessBlock(BasicBlock *BB) {
|
||||||
|
@ -200,3 +200,36 @@ bool llvm::dceInstruction(BasicBlock::iterator &BBI) {
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
// Control Flow Graph Restructuring...
|
||||||
|
//
|
||||||
|
|
||||||
|
/// MergeBasicBlockIntoOnlyPred - DestBB is a block with one predecessor and its
|
||||||
|
/// predecessor is known to have one successor (DestBB!). Eliminate the edge
|
||||||
|
/// between them, moving the instructions in the predecessor into DestBB and
|
||||||
|
/// deleting the predecessor block.
|
||||||
|
///
|
||||||
|
void llvm::MergeBasicBlockIntoOnlyPred(BasicBlock *DestBB) {
|
||||||
|
// If BB has single-entry PHI nodes, fold them.
|
||||||
|
while (PHINode *PN = dyn_cast<PHINode>(DestBB->begin())) {
|
||||||
|
Value *NewVal = PN->getIncomingValue(0);
|
||||||
|
// Replace self referencing PHI with undef, it must be dead.
|
||||||
|
if (NewVal == PN) NewVal = UndefValue::get(PN->getType());
|
||||||
|
PN->replaceAllUsesWith(NewVal);
|
||||||
|
PN->eraseFromParent();
|
||||||
|
}
|
||||||
|
|
||||||
|
BasicBlock *PredBB = DestBB->getSinglePredecessor();
|
||||||
|
assert(PredBB && "Block doesn't have a single predecessor!");
|
||||||
|
|
||||||
|
// Splice all the instructions from PredBB to DestBB.
|
||||||
|
PredBB->getTerminator()->eraseFromParent();
|
||||||
|
DestBB->getInstList().splice(DestBB->begin(), PredBB->getInstList());
|
||||||
|
|
||||||
|
// Anything that branched to PredBB now branches to DestBB.
|
||||||
|
PredBB->replaceAllUsesWith(DestBB);
|
||||||
|
|
||||||
|
// Nuke BB.
|
||||||
|
PredBB->eraseFromParent();
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user