mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-21 19:48:46 +00:00
Move domtree/frontier updating earlier, allowing us to use it to update phi
nodes, removing a hack. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@50019 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
b85979434d
commit
1b58678d54
@ -277,6 +277,19 @@ BasicBlock *LoopSimplify::SplitBlockPredecessors(BasicBlock *BB,
|
|||||||
// The preheader first gets an unconditional branch to the loop header.
|
// The preheader first gets an unconditional branch to the loop header.
|
||||||
BranchInst *BI = BranchInst::Create(BB, NewBB);
|
BranchInst *BI = BranchInst::Create(BB, NewBB);
|
||||||
|
|
||||||
|
// Move the edges from Preds to point to NewBB instead of BB.
|
||||||
|
for (unsigned i = 0, e = Preds.size(); i != e; ++i) {
|
||||||
|
Preds[i]->getTerminator()->replaceUsesOfWith(BB, NewBB);
|
||||||
|
|
||||||
|
if (Preds[i]->getUnwindDest() == BB)
|
||||||
|
Preds[i]->setUnwindDest(NewBB);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update dominator tree and dominator frontier if available.
|
||||||
|
DT->splitBlock(NewBB);
|
||||||
|
if (DominanceFrontier *DF = getAnalysisToUpdate<DominanceFrontier>())
|
||||||
|
DF->splitBlock(NewBB);
|
||||||
|
|
||||||
// For every PHI node in the block, insert a PHI node into NewBB where the
|
// For every PHI node in the block, insert a PHI node into NewBB where the
|
||||||
// incoming values from the out of loop edges are moved to NewBB. We have two
|
// incoming values from the out of loop edges are moved to NewBB. We have two
|
||||||
// possible cases here. If the loop is dead, we just insert dummy entries
|
// possible cases here. If the loop is dead, we just insert dummy entries
|
||||||
@ -284,15 +297,9 @@ BasicBlock *LoopSimplify::SplitBlockPredecessors(BasicBlock *BB,
|
|||||||
// incoming edges in BB into new PHI nodes in NewBB.
|
// incoming edges in BB into new PHI nodes in NewBB.
|
||||||
//
|
//
|
||||||
if (Preds.empty()) { // Is the loop obviously dead?
|
if (Preds.empty()) { // Is the loop obviously dead?
|
||||||
for (BasicBlock::iterator I = BB->begin(); isa<PHINode>(I); ++I) {
|
// Insert dummy values as the incoming value.
|
||||||
PHINode *PN = cast<PHINode>(I);
|
for (BasicBlock::iterator I = BB->begin(); isa<PHINode>(I); ++I)
|
||||||
// Insert dummy values as the incoming value...
|
cast<PHINode>(I)->addIncoming(UndefValue::get(I->getType()), NewBB);
|
||||||
PN->addIncoming(Constant::getNullValue(PN->getType()), NewBB);
|
|
||||||
}
|
|
||||||
|
|
||||||
DT->splitBlock(NewBB);
|
|
||||||
if (DominanceFrontier *DF = getAnalysisToUpdate<DominanceFrontier>())
|
|
||||||
DF->splitBlock(NewBB);
|
|
||||||
|
|
||||||
return NewBB;
|
return NewBB;
|
||||||
}
|
}
|
||||||
@ -339,34 +346,14 @@ BasicBlock *LoopSimplify::SplitBlockPredecessors(BasicBlock *BB,
|
|||||||
// Can we eliminate this phi node now?
|
// Can we eliminate this phi node now?
|
||||||
if (Value *V = PN->hasConstantValue(true)) {
|
if (Value *V = PN->hasConstantValue(true)) {
|
||||||
Instruction *I = dyn_cast<Instruction>(V);
|
Instruction *I = dyn_cast<Instruction>(V);
|
||||||
// If I is in NewBB, the Dominator call will fail, because NewBB isn't
|
if (!I || DT->dominates(I, PN)) {
|
||||||
// registered in DominatorTree yet. Handle this case explicitly.
|
|
||||||
if (!I || (I->getParent() != NewBB &&
|
|
||||||
DT->dominates(I, PN))) {
|
|
||||||
PN->replaceAllUsesWith(V);
|
PN->replaceAllUsesWith(V);
|
||||||
if (AA) AA->deleteValue(PN);
|
if (AA) AA->deleteValue(PN);
|
||||||
BB->getInstList().erase(PN);
|
PN->eraseFromParent();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Now that the PHI nodes are updated, actually move the edges from
|
|
||||||
// Preds to point to NewBB instead of BB.
|
|
||||||
//
|
|
||||||
for (unsigned i = 0, e = Preds.size(); i != e; ++i) {
|
|
||||||
TerminatorInst *TI = Preds[i]->getTerminator();
|
|
||||||
for (unsigned s = 0, e = TI->getNumSuccessors(); s != e; ++s)
|
|
||||||
if (TI->getSuccessor(s) == BB)
|
|
||||||
TI->setSuccessor(s, NewBB);
|
|
||||||
|
|
||||||
if (Preds[i]->getUnwindDest() == BB)
|
|
||||||
Preds[i]->setUnwindDest(NewBB);
|
|
||||||
}
|
|
||||||
|
|
||||||
DT->splitBlock(NewBB);
|
|
||||||
if (DominanceFrontier *DF = getAnalysisToUpdate<DominanceFrontier>())
|
|
||||||
DF->splitBlock(NewBB);
|
|
||||||
|
|
||||||
return NewBB;
|
return NewBB;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user