aboutsummaryrefslogtreecommitdiffstats
path: root/lib/VMCore/Dominators.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2002-10-04 14:45:48 +0000
committerChris Lattner <sabre@nondot.org>2002-10-04 14:45:48 +0000
commit4e4caeffbdf3da85b980386131f6fd364a981153 (patch)
tree23b841084cdc2719ae1521274a7bc7c066805d26 /lib/VMCore/Dominators.cpp
parenta00397e1eeaaffc21d01af612480476fe95b20a5 (diff)
downloadexternal_llvm-4e4caeffbdf3da85b980386131f6fd364a981153.zip
external_llvm-4e4caeffbdf3da85b980386131f6fd364a981153.tar.gz
external_llvm-4e4caeffbdf3da85b980386131f6fd364a981153.tar.bz2
Fix a nasty problem with dominance calculation for unreachable blocks.
If we had a CFG that look like Entry -> B, Unreachable -> B, then we would not correctly determine that Entry dominated B, because Entry did not apparently dominate "unreachable". This patch fixes this by making the entry node dominate all blocks, including unreachable ones. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@4037 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/VMCore/Dominators.cpp')
-rw-r--r--lib/VMCore/Dominators.cpp25
1 files changed, 20 insertions, 5 deletions
diff --git a/lib/VMCore/Dominators.cpp b/lib/VMCore/Dominators.cpp
index 99fda80..37e7d48 100644
--- a/lib/VMCore/Dominators.cpp
+++ b/lib/VMCore/Dominators.cpp
@@ -61,6 +61,18 @@ void DominatorSet::calculateDominatorsFromBlock(BasicBlock *RootBB) {
if (PredSet.size())
set_intersect(WorkingSet, PredSet);
}
+ } else if (BB != Root) {
+ // If this isn't the root basic block and it has no predecessors, it
+ // must be an unreachable block. Fib a bit by saying that the root node
+ // dominates this unreachable node. This isn't exactly true, because
+ // there is no path from the entry node to this node, but it is sorta
+ // true because any paths to this node would have to go through the
+ // entry node.
+ //
+ // This allows for dominator properties to be built for unreachable code
+ // in a reasonable manner.
+ //
+ WorkingSet = Doms[Root];
}
WorkingSet.insert(BB); // A block always dominates itself
@@ -95,9 +107,8 @@ bool DominatorSet::runOnFunction(Function &F) {
// unreachable blocks.
//
for (Function::iterator I = F.begin(), E = F.end(); I != E; ++I)
- if (Doms[I].empty()) {
+ if (Doms[I].count(I) == 0)
calculateDominatorsFromBlock(I);
- }
return false;
}
@@ -166,10 +177,14 @@ void ImmediateDominatorsBase::calcIDoms(const DominatorSetBase &DS) {
}
void ImmediateDominatorsBase::print(std::ostream &o) const {
- for (const_iterator I = begin(), E = end(); I != E; ++I)
+ for (const_iterator I = begin(), E = end(); I != E; ++I) {
o << "=============================--------------------------------\n"
- << "\nImmediate Dominator For Basic Block\n" << *I->first
- << "is: \n" << *I->second << "\n";
+ << "\nImmediate Dominator For Basic Block:";
+ WriteAsOperand(o, I->first, false);
+ o << " is:";
+ WriteAsOperand(o, I->second, false);
+ o << "\n";
+ }
}