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();
// 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);
// 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;
}