When one branch of condition is eliminated then head of the other

branch is not necessary immediate dominators of merge blcok in all cases.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@41144 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Devang Patel
2007-08-17 21:59:16 +00:00
parent 3e20bba5eb
commit 96bf524b53
3 changed files with 64 additions and 22 deletions

View File

@@ -438,6 +438,26 @@ public:
/// frontier to reflect this change.
void splitBlock(BasicBlock *BB);
/// BasicBlock BB's new dominator is NewBB. Update BB's dominance frontier
/// to reflect this change.
void changeImmediateDominator(BasicBlock *BB, BasicBlock *NewBB,
DominatorTree *DT) {
// NewBB is now dominating BB. Which means BB's dominance
// frontier is now part of NewBB's dominance frontier. However, BB
// itself is not member of NewBB's dominance frontier.
DominanceFrontier::iterator NewDFI = find(NewBB);
DominanceFrontier::iterator DFI = find(BB);
DominanceFrontier::DomSetType BBSet = DFI->second;
for (DominanceFrontier::DomSetType::iterator BBSetI = BBSet.begin(),
BBSetE = BBSet.end(); BBSetI != BBSetE; ++BBSetI) {
BasicBlock *DFMember = *BBSetI;
// Insert only if NewBB dominates DFMember.
if (!DT->dominates(NewBB, DFMember))
NewDFI->second.insert(DFMember);
}
NewDFI->second.erase(BB);
}
private:
const DomSetType &calculate(const DominatorTree &DT,
const DomTreeNode *Node);