mirror of
https://github.com/RPCSX/llvm.git
synced 2025-01-27 07:12:06 +00:00
Fix dom frontier update. This fixes PR4667.
Patch by Jakub Staszak. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@78388 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
bdab0e9695
commit
b7f40c1a2a
@ -511,26 +511,30 @@ void LoopRotate::preserveCanonicalLoopForm(LPPassManager &LPM) {
|
||||
DF->addBasicBlock(L->getHeader(), LatchSet);
|
||||
}
|
||||
|
||||
// If a loop block dominates new loop latch then its frontier is
|
||||
// new header and Exit.
|
||||
// If a loop block dominates new loop latch then add to its frontiers
|
||||
// new header and Exit and remove new latch (which is equal to original
|
||||
// header).
|
||||
BasicBlock *NewLatch = L->getLoopLatch();
|
||||
DominatorTree *DT = getAnalysisIfAvailable<DominatorTree>();
|
||||
for (Loop::block_iterator BI = L->block_begin(), BE = L->block_end();
|
||||
BI != BE; ++BI) {
|
||||
BasicBlock *B = *BI;
|
||||
if (DT->dominates(B, NewLatch)) {
|
||||
DominanceFrontier::iterator BDFI = DF->find(B);
|
||||
if (BDFI != DF->end()) {
|
||||
DominanceFrontier::DomSetType &BSet = BDFI->second;
|
||||
BSet = BDFI->second;
|
||||
BSet.clear();
|
||||
BSet.insert(L->getHeader());
|
||||
BSet.insert(Exit);
|
||||
} else {
|
||||
DominanceFrontier::DomSetType BSet;
|
||||
BSet.insert(L->getHeader());
|
||||
BSet.insert(Exit);
|
||||
DF->addBasicBlock(B, BSet);
|
||||
|
||||
assert(NewLatch == OrigHeader && "NewLatch is inequal to OrigHeader");
|
||||
|
||||
if (DominatorTree *DT = getAnalysisIfAvailable<DominatorTree>()) {
|
||||
for (Loop::block_iterator BI = L->block_begin(), BE = L->block_end();
|
||||
BI != BE; ++BI) {
|
||||
BasicBlock *B = *BI;
|
||||
if (DT->dominates(B, NewLatch)) {
|
||||
DominanceFrontier::iterator BDFI = DF->find(B);
|
||||
if (BDFI != DF->end()) {
|
||||
DominanceFrontier::DomSetType &BSet = BDFI->second;
|
||||
BSet.erase(NewLatch);
|
||||
BSet.insert(L->getHeader());
|
||||
BSet.insert(Exit);
|
||||
} else {
|
||||
DominanceFrontier::DomSetType BSet;
|
||||
BSet.insert(L->getHeader());
|
||||
BSet.insert(Exit);
|
||||
DF->addBasicBlock(B, BSet);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user