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
This commit is contained in:
Chris Lattner 2002-05-13 22:03:16 +00:00
parent e0e734eea0
commit ef704a23b4
3 changed files with 35 additions and 0 deletions

View File

@ -20,6 +20,7 @@
#include "llvm/Pass.h" #include "llvm/Pass.h"
#include <set> #include <set>
class Instruction;
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
// //
@ -95,6 +96,12 @@ public:
return getDominators(B).count(A) != 0; 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 // getAnalysisUsage - This obviously provides a dominator set, but it also
// uses the UnifyFunctionExitNode pass if building post-dominators // uses the UnifyFunctionExitNode pass if building post-dominators
// //

View File

@ -31,6 +31,20 @@ bool DominatorSet::runOnFunction(Function *F) {
return false; 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 // calcForwardDominatorSet - This method calculates the forward dominator sets
// for the specified function. // for the specified function.

View File

@ -31,6 +31,20 @@ bool DominatorSet::runOnFunction(Function *F) {
return false; 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 // calcForwardDominatorSet - This method calculates the forward dominator sets
// for the specified function. // for the specified function.