Add method to check to see if two _Instructions_ dominate each other


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@2616 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/include/llvm/Analysis/Dominators.h b/include/llvm/Analysis/Dominators.h
index e3038da..796a779 100644
--- a/include/llvm/Analysis/Dominators.h
+++ b/include/llvm/Analysis/Dominators.h
@@ -20,6 +20,7 @@
 
 #include "llvm/Pass.h"
 #include <set>
+class Instruction;
 
 //===----------------------------------------------------------------------===//
 //
@@ -95,6 +96,12 @@
     return getDominators(B).count(A) != 0;
   }
 
+  // dominates - Return true if A dominates B.  This performs the special checks
+  // neccesary if A and B are in the same basic block.
+  //
+  bool dominates(Instruction *A, Instruction *B) const;
+
+
   // getAnalysisUsage - This obviously provides a dominator set, but it also
   // uses the UnifyFunctionExitNode pass if building post-dominators
   //
diff --git a/lib/Analysis/PostDominators.cpp b/lib/Analysis/PostDominators.cpp
index e4eb2c1..ca0b64a 100644
--- a/lib/Analysis/PostDominators.cpp
+++ b/lib/Analysis/PostDominators.cpp
@@ -31,6 +31,20 @@
   return false;
 }
 
+// dominates - Return true if A dominates B.  This performs the special checks
+// neccesary if A and B are in the same basic block.
+//
+bool DominatorSet::dominates(Instruction *A, Instruction *B) const {
+  BasicBlock *BBA = A->getParent(), *BBB = B->getParent();
+  if (BBA != BBB) return dominates(BBA, BBB);
+  
+  // Loop through the basic block until we find A or B.
+  BasicBlock::iterator I = BBA->begin();
+  for (; *I != A && *I != B; ++I) /*empty*/;
+  
+  // A dominates B if it is found first in the basic block...
+  return *I == A;
+}
 
 // calcForwardDominatorSet - This method calculates the forward dominator sets
 // for the specified function.
diff --git a/lib/VMCore/Dominators.cpp b/lib/VMCore/Dominators.cpp
index e4eb2c1..ca0b64a 100644
--- a/lib/VMCore/Dominators.cpp
+++ b/lib/VMCore/Dominators.cpp
@@ -31,6 +31,20 @@
   return false;
 }
 
+// dominates - Return true if A dominates B.  This performs the special checks
+// neccesary if A and B are in the same basic block.
+//
+bool DominatorSet::dominates(Instruction *A, Instruction *B) const {
+  BasicBlock *BBA = A->getParent(), *BBB = B->getParent();
+  if (BBA != BBB) return dominates(BBA, BBB);
+  
+  // Loop through the basic block until we find A or B.
+  BasicBlock::iterator I = BBA->begin();
+  for (; *I != A && *I != B; ++I) /*empty*/;
+  
+  // A dominates B if it is found first in the basic block...
+  return *I == A;
+}
 
 // calcForwardDominatorSet - This method calculates the forward dominator sets
 // for the specified function.