aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2002-08-22 20:39:29 +0000
committerChris Lattner <sabre@nondot.org>2002-08-22 20:39:29 +0000
commit80b7f8ceb4ea78276f69fe2ae6dfb172f4895165 (patch)
tree0de77f2014ceec4a972ee01f829d4754d9b8522a
parente6d2fdff26708cd5e3f76cf2a5d7126ae7edfe93 (diff)
Fix bug: test/Regression/Assembler/2002-08-22-DominanceProblem.ll
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@3474 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/VMCore/Dominators.cpp36
1 files changed, 23 insertions, 13 deletions
diff --git a/lib/VMCore/Dominators.cpp b/lib/VMCore/Dominators.cpp
index e4bcec09f1..cd0825c128 100644
--- a/lib/VMCore/Dominators.cpp
+++ b/lib/VMCore/Dominators.cpp
@@ -36,21 +36,15 @@ bool DominatorSetBase::dominates(Instruction *A, Instruction *B) const {
return &*I == A;
}
-// runOnFunction - This method calculates the forward dominator sets for the
-// 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!");
+void DominatorSet::calculateDominatorsFromBlock(BasicBlock *RootBB) {
bool Changed;
+ Doms[RootBB].insert(RootBB); // Root always dominates itself...
do {
Changed = false;
DomSetType WorkingSet;
- df_iterator<Function*> It = df_begin(&F), End = df_end(&F);
+ df_iterator<BasicBlock*> It = df_begin(RootBB), End = df_end(RootBB);
for ( ; It != End; ++It) {
BasicBlock *BB = *It;
pred_iterator PI = pred_begin(BB), PEnd = pred_end(BB);
@@ -78,16 +72,32 @@ bool DominatorSet::runOnFunction(Function &F) {
WorkingSet.clear(); // Clear out the set for next iteration
}
} while (Changed);
+}
+
+
+
+// runOnFunction - This method calculates the forward dominator sets for the
+// 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!");
+
+ // Calculate dominator sets for the reachable basic blocks...
+ calculateDominatorsFromBlock(Root);
// Every basic block in the function should at least dominate themselves, and
// thus every basic block should have an entry in Doms. The one case where we
// miss this is when a basic block is unreachable. To get these we now do an
- // extra pass adding self dominance info to the DomSet if the block doesn't
- // already have an entry.
+ // extra pass over the function, calculating dominator information for
+ // unreachable blocks.
//
for (Function::iterator I = F.begin(), E = F.end(); I != E; ++I)
- if (Doms[I].empty())
- Doms[I].insert(I);
+ if (Doms[I].empty()) {
+ calculateDominatorsFromBlock(I);
+ }
return false;
}