diff options
author | Chris Lattner <sabre@nondot.org> | 2001-08-23 17:07:19 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2001-08-23 17:07:19 +0000 |
commit | 384e5b1595fbc766552f2f2f74586d7b53519623 (patch) | |
tree | a57917d92a8d185b6acfe542dee5a8076f4a1a84 /lib/Analysis/PostDominators.cpp | |
parent | 9407be443e5a05ca5fca9cc876237b80c04428a3 (diff) |
Handle case where there is no exit node from a flowgraph
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@365 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/PostDominators.cpp')
-rw-r--r-- | lib/Analysis/PostDominators.cpp | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/lib/Analysis/PostDominators.cpp b/lib/Analysis/PostDominators.cpp index 707b5334a5..24ff439994 100644 --- a/lib/Analysis/PostDominators.cpp +++ b/lib/Analysis/PostDominators.cpp @@ -32,7 +32,8 @@ void set_intersect(set<Ty> &S1, const set<Ty2> &S2) { //===----------------------------------------------------------------------===// bool cfg::DominatorBase::isPostDominator() const { - return Root != Root->getParent()->front(); + // Root can be null if there is no exit node from the CFG and is postdom set + return Root == 0 || Root != Root->getParent()->front(); } @@ -96,7 +97,11 @@ cfg::DominatorSet::DominatorSet(Method *M, bool PostDomSet) if (!PostDomSet) { calcForwardDominatorSet(M); return; } Root = cfg::UnifyAllExitNodes(M); - assert(Root && "TODO: Don't handle case where there are no exit nodes yet!"); + if (Root == 0) { // No exit node for the method? Postdomsets are all empty + for (Method::iterator MI = M->begin(), ME = M->end(); MI != ME; ++MI) + Doms[*MI] = DomSetType(); + return; + } bool Changed; do { @@ -255,7 +260,7 @@ void cfg::DominatorTree::calculate(const DominatorSet &DS) { } } } - } else { + } else if (Root) { // Iterate over all nodes in depth first order... for (idf_const_iterator I = idf_begin(Root), E = idf_end(Root); I != E; ++I) { const BasicBlock *BB = *I; @@ -343,6 +348,7 @@ cfg::DominanceFrontier::calcPostDomFrontier(const DominatorTree &DT, // Loop over CFG successors to calculate DFlocal[Node] const BasicBlock *BB = Node->getNode(); DomSetType &S = Frontiers[BB]; // The new set to fill in... + if (!Root) return S; for (pred_const_iterator SI = pred_begin(BB), SE = pred_end(BB); SI != SE; ++SI) { |