Add function DominatorTree::getDescendants().

As its name suggests, this function will return all basic blocks
dominated by a given block.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@191014 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Shuxin Yang 2013-09-19 17:18:35 +00:00
parent a22ff961db
commit 4f77a21d6c

View File

@ -346,6 +346,20 @@ public:
DomTreeNodeBase<NodeT> *getRootNode() { return RootNode; } DomTreeNodeBase<NodeT> *getRootNode() { return RootNode; }
const DomTreeNodeBase<NodeT> *getRootNode() const { return RootNode; } const DomTreeNodeBase<NodeT> *getRootNode() const { return RootNode; }
/// Get all nodes dominated by R, including R itself. Return true on success.
void getDescendants(NodeT *R, SmallVectorImpl<NodeT *> &Result) const {
const DomTreeNodeBase<NodeT> *RN = getNode(R);
SmallVector<const DomTreeNodeBase<NodeT> *, 8> WL;
WL.push_back(RN);
Result.clear();
while (!WL.empty()) {
const DomTreeNodeBase<NodeT> *N = WL.pop_back_val();
Result.push_back(N->getBlock());
WL.append(N->begin(), N->end());
}
}
/// properlyDominates - Returns true iff A dominates B and A != B. /// properlyDominates - Returns true iff A dominates B and A != B.
/// Note that this is not a constant time operation! /// Note that this is not a constant time operation!
/// ///
@ -755,6 +769,12 @@ public:
return DT->getRootNode(); return DT->getRootNode();
} }
/// Get all nodes dominated by R, including R itself. Return true on success.
void getDescendants(BasicBlock *R,
SmallVectorImpl<BasicBlock *> &Result) const {
DT->getDescendants(R, Result);
}
/// compare - Return false if the other dominator tree matches this /// compare - Return false if the other dominator tree matches this
/// dominator tree. Otherwise return true. /// dominator tree. Otherwise return true.
inline bool compare(DominatorTree &Other) const { inline bool compare(DominatorTree &Other) const {