mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-11 06:06:52 +00:00
Add and use DominatorTreeBase::findNearestCommonDominator().
llvm-svn: 37545
This commit is contained in:
parent
c9a156f041
commit
bc3887310b
@ -234,6 +234,10 @@ protected:
|
||||
return dominates(getNode(A), getNode(B));
|
||||
}
|
||||
|
||||
/// findNearestCommonDominator - Find nearest common dominator basic block
|
||||
/// for basic block A and B. If there is no such block then return NULL.
|
||||
BasicBlock *findNearestCommonDominator(BasicBlock *A, BasicBlock *B);
|
||||
|
||||
// dominates - Return true if A dominates B. This performs the
|
||||
// special checks necessary if A and B are in the same basic block.
|
||||
bool dominates(Instruction *A, Instruction *B);
|
||||
|
@ -768,7 +768,7 @@ void LoopSimplify::UpdateDomInfoForRevectoredPreds(BasicBlock *NewBB,
|
||||
assert(i != PredBlocks.size() && "No reachable preds?");
|
||||
for (i = i + 1; i < PredBlocks.size(); ++i) {
|
||||
if (DT.isReachableFromEntry(PredBlocks[i]))
|
||||
NewBBIDom = DT.nearestCommonDominator(NewBBIDom, PredBlocks[i]);
|
||||
NewBBIDom = DT.findNearestCommonDominator(NewBBIDom, PredBlocks[i]);
|
||||
}
|
||||
assert(NewBBIDom && "No immediate dominator found??");
|
||||
|
||||
|
@ -23,6 +23,7 @@
|
||||
#include "llvm/Instructions.h"
|
||||
#include "llvm/Support/Streams.h"
|
||||
#include <algorithm>
|
||||
#include <set>
|
||||
using namespace llvm;
|
||||
|
||||
namespace llvm {
|
||||
@ -369,6 +370,50 @@ void DominatorTreeBase::reset() {
|
||||
RootNode = 0;
|
||||
}
|
||||
|
||||
/// findNearestCommonDominator - Find nearest common dominator basic block
|
||||
/// for basic block A and B. If there is no such block then return NULL.
|
||||
BasicBlock *DominatorTreeBase::findNearestCommonDominator(BasicBlock *A, BasicBlock *B) {
|
||||
|
||||
assert (!isPostDominator() && "This is not implemented for post dominators");
|
||||
assert (A->getParent() == B->getParent() && "Two blocks are not in same function");
|
||||
|
||||
// If either A or B is a entry block then it is nearest common dominator.
|
||||
BasicBlock &Entry = A->getParent()->getEntryBlock();
|
||||
if (A == &Entry || B == &Entry)
|
||||
return &Entry;
|
||||
|
||||
// If A and B are same then A is nearest common dominator.
|
||||
DomTreeNode *NodeA = getNode(A);
|
||||
if (A != 0 && A == B)
|
||||
return A;
|
||||
|
||||
DomTreeNode *NodeB = getNode(B);
|
||||
|
||||
// Collect NodeA dominators set.
|
||||
std::set<DomTreeNode *> NodeADoms;
|
||||
NodeADoms.insert(NodeA);
|
||||
DomTreeNode *IDomA = NodeA->getIDom();
|
||||
while(IDomA) {
|
||||
NodeADoms.insert(IDomA);
|
||||
IDomA = IDomA->getIDom();
|
||||
}
|
||||
|
||||
// If B dominates A then B is nearest common dominator.
|
||||
if (NodeADoms.count(NodeB) != 0)
|
||||
return B;
|
||||
|
||||
// Walk NodeB immediate dominators chain and find common dominator node.
|
||||
DomTreeNode *IDomB = NodeB->getIDom();
|
||||
while(IDomB) {
|
||||
if (NodeADoms.count(IDomB) != 0)
|
||||
return IDomB->getBlock();
|
||||
|
||||
IDomB = IDomB->getIDom();
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void DomTreeNode::setIDom(DomTreeNode *NewIDom) {
|
||||
assert(IDom && "No immediate dominator?");
|
||||
if (IDom != NewIDom) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user