Expose new "recalculate" method from dominatorset

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@4074 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2002-10-08 19:12:08 +00:00
parent de013f53a7
commit 7ca266fe1f
2 changed files with 13 additions and 4 deletions

View File

@ -128,6 +128,11 @@ struct DominatorSet : public DominatorSetBase {
virtual bool runOnFunction(Function &F);
/// recalculate - This method may be called by external passes that modify the
/// CFG and then need dominator information recalculated. This method is
/// obviously really slow, so it should be avoided if at all possible.
void recalculate();
// getAnalysisUsage - This simply provides a dominator set
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
AU.setPreservesAll();

View File

@ -92,10 +92,15 @@ void DominatorSet::calculateDominatorsFromBlock(BasicBlock *RootBB) {
// specified function.
//
bool DominatorSet::runOnFunction(Function &F) {
Doms.clear(); // Reset from the last time we were run...
Root = &F.getEntryNode();
assert(pred_begin(Root) == pred_end(Root) &&
"Root node has predecessors in function!");
recalculate();
return false;
}
void DominatorSet::recalculate() {
Doms.clear(); // Reset from the last time we were run...
// Calculate dominator sets for the reachable basic blocks...
calculateDominatorsFromBlock(Root);
@ -106,11 +111,10 @@ bool DominatorSet::runOnFunction(Function &F) {
// extra pass over the function, calculating dominator information for
// unreachable blocks.
//
for (Function::iterator I = F.begin(), E = F.end(); I != E; ++I)
Function *F = Root->getParent();
for (Function::iterator I = F->begin(), E = F->end(); I != E; ++I)
if (Doms[I].count(I) == 0)
calculateDominatorsFromBlock(I);
return false;
}