mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-03-03 14:31:10 +00:00
Do not insert one entry PHI nodes in split exit blocks!
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@10348 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
73d8d55e0e
commit
010ba10032
@ -162,21 +162,31 @@ BasicBlock *LoopSimplify::SplitBlockPredecessors(BasicBlock *BB,
|
||||
// incoming edges in BB into new PHI nodes in NewBB.
|
||||
//
|
||||
if (!Preds.empty()) { // Is the loop not obviously dead?
|
||||
for (BasicBlock::iterator I = BB->begin();
|
||||
PHINode *PN = dyn_cast<PHINode>(I); ++I) {
|
||||
|
||||
// Create the new PHI node, insert it into NewBB at the end of the block
|
||||
PHINode *NewPHI = new PHINode(PN->getType(), PN->getName()+".ph", BI);
|
||||
|
||||
// Move all of the edges from blocks outside the loop to the new PHI
|
||||
for (unsigned i = 0, e = Preds.size(); i != e; ++i) {
|
||||
Value *V = PN->removeIncomingValue(Preds[i]);
|
||||
NewPHI->addIncoming(V, Preds[i]);
|
||||
if (Preds.size() == 1) {
|
||||
// No need to insert one operand PHI nodes! Instead, just update the
|
||||
// incoming block ID's.
|
||||
for (BasicBlock::iterator I = BB->begin();
|
||||
PHINode *PN = dyn_cast<PHINode>(I); ++I) {
|
||||
unsigned i = PN->getBasicBlockIndex(Preds[0]);
|
||||
PN->setIncomingBlock(i, NewBB);
|
||||
}
|
||||
} else {
|
||||
for (BasicBlock::iterator I = BB->begin();
|
||||
PHINode *PN = dyn_cast<PHINode>(I); ++I) {
|
||||
|
||||
// Create the new PHI node, insert it into NewBB at the end of the block
|
||||
PHINode *NewPHI = new PHINode(PN->getType(), PN->getName()+".ph", BI);
|
||||
|
||||
// Move all of the edges from blocks outside the loop to the new PHI
|
||||
for (unsigned i = 0, e = Preds.size(); i != e; ++i) {
|
||||
Value *V = PN->removeIncomingValue(Preds[i]);
|
||||
NewPHI->addIncoming(V, Preds[i]);
|
||||
}
|
||||
|
||||
// Add an incoming value to the PHI node in the loop for the preheader
|
||||
// edge.
|
||||
PN->addIncoming(NewPHI, NewBB);
|
||||
}
|
||||
|
||||
// Add an incoming value to the PHI node in the loop for the preheader
|
||||
// edge
|
||||
PN->addIncoming(NewPHI, NewBB);
|
||||
}
|
||||
|
||||
// Now that the PHI nodes are updated, actually move the edges from
|
||||
|
Loading…
x
Reference in New Issue
Block a user