Add dominates/properlyDominates queries to IDom.
authorChris Lattner <sabre@nondot.org>
Tue, 1 Aug 2006 22:24:47 +0000 (22:24 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 1 Aug 2006 22:24:47 +0000 (22:24 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@29456 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Analysis/Dominators.h
lib/VMCore/Dominators.cpp

index 31b8562f2c3bee11a91560e20cab9cdbd05a2574..085225505e3f0b256572cee60299cd869fdddfec 100644 (file)
@@ -101,7 +101,17 @@ public:
   inline BasicBlock *operator[](BasicBlock *BB) const {
     return get(BB);
   }
+  
+  /// dominates - Return true if A dominates B.
+  ///
+  bool dominates(BasicBlock *A, BasicBlock *B) const;
 
+  /// properlyDominates - Return true if A dominates B and A != B.
+  ///
+  bool properlyDominates(BasicBlock *A, BasicBlock *B) const {
+    return A != B || properlyDominates(A, B);
+  }
+  
   /// get() - Synonym for operator[].
   ///
   inline BasicBlock *get(BasicBlock *BB) const {
index 35c847f7d6df9b477216d7bf1ea082039e830dd2..f079acfdb44fcd9ee6e6e31de82f2f1aaaa4fc6c 100644 (file)
@@ -211,6 +211,17 @@ bool ImmediateDominators::runOnFunction(Function &F) {
   return false;
 }
 
+/// dominates - Return true if A dominates B.
+///
+bool ImmediateDominatorsBase::dominates(BasicBlock *A, BasicBlock *B) const {
+  assert(A && B && "Null pointers?");
+  
+  // Walk up the dominator tree from B to determine if A dom B.
+  while (A != B && B)
+    B = get(B);
+  return A == B;
+}
+
 void ImmediateDominatorsBase::print(std::ostream &o, const Module* ) const {
   Function *F = getRoots()[0]->getParent();
   for (Function::iterator I = F->begin(), E = F->end(); I != E; ++I) {