diff options
author | Owen Anderson <resistor@mac.com> | 2008-05-04 21:07:35 +0000 |
---|---|---|
committer | Owen Anderson <resistor@mac.com> | 2008-05-04 21:07:35 +0000 |
commit | 46bb007014414c966586a983dbf24f38490e0f22 (patch) | |
tree | 4250b409ee3f01854c356038846cf5464235e759 /include | |
parent | 84cb71bbc530033905fe52e455a03dcf7a82e3ae (diff) | |
download | external_llvm-46bb007014414c966586a983dbf24f38490e0f22.zip external_llvm-46bb007014414c966586a983dbf24f38490e0f22.tar.gz external_llvm-46bb007014414c966586a983dbf24f38490e0f22.tar.bz2 |
Fix PR1098 by correcting the postdominators analysis.
Patch by Florian Brandner.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@50628 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include')
-rw-r--r-- | include/llvm/Analysis/DominatorInternals.h | 32 | ||||
-rw-r--r-- | include/llvm/Analysis/Dominators.h | 10 |
2 files changed, 13 insertions, 29 deletions
diff --git a/include/llvm/Analysis/DominatorInternals.h b/include/llvm/Analysis/DominatorInternals.h index 6d95a4b..063602e 100644 --- a/include/llvm/Analysis/DominatorInternals.h +++ b/include/llvm/Analysis/DominatorInternals.h @@ -233,14 +233,7 @@ void Calculate(DominatorTreeBase<typename GraphTraits<NodeT>::NodeType>& DT, typedef GraphTraits<NodeT> GraphT; unsigned N = 0; - - // Add a node for the root. This node might be the actual root, if there is - // one exit block, or it may be the virtual exit (denoted by (BasicBlock *)0) - // which postdominates all real exits if there are multiple exit blocks. - typename GraphT::NodeType* Root = DT.Roots.size() == 1 ? DT.Roots[0] - : 0; bool MultipleRoots = (DT.Roots.size() > 1); - if (MultipleRoots) { typename DominatorTreeBase<typename GraphT::NodeType>::InfoRec &BBInfo = DT.Info[NULL]; @@ -258,6 +251,10 @@ void Calculate(DominatorTreeBase<typename GraphTraits<NodeT>::NodeType>& DT, for (unsigned i = 0, e = DT.Roots.size(); i != e; ++i) N = DFSPass<GraphT>(DT, DT.Roots[i], N); + // it might be that some blocks did not get a DFS number (e.g., blocks of + // infinite loops). In these cases an artificial exit node is required. + MultipleRoots |= (DT.isPostDominator() && N != F.size()); + for (unsigned i = N; i >= 2; --i) { typename GraphT::NodeType* W = DT.Vertex[i]; typename DominatorTreeBase<typename GraphT::NodeType>::InfoRec &WInfo = @@ -311,15 +308,18 @@ void Calculate(DominatorTreeBase<typename GraphTraits<NodeT>::NodeType>& DT, if (WIDom != DT.Vertex[DT.Info[W].Semi]) WIDom = DT.IDoms[WIDom]; } - + if (DT.Roots.empty()) return; - + // Add a node for the root. This node might be the actual root, if there is // one exit block, or it may be the virtual exit (denoted by (BasicBlock *)0) - // which postdominates all real exits if there are multiple exit blocks. + // which postdominates all real exits if there are multiple exit blocks, or + // an infinite loop. + typename GraphT::NodeType* Root = !MultipleRoots ? DT.Roots[0] : 0; + DT.DomTreeNodes[Root] = DT.RootNode = new DomTreeNodeBase<typename GraphT::NodeType>(Root, 0); - + // Loop over all of the reachable blocks in the function... for (unsigned i = 2; i <= N; ++i) { typename GraphT::NodeType* W = DT.Vertex[i]; @@ -329,20 +329,12 @@ void Calculate(DominatorTreeBase<typename GraphTraits<NodeT>::NodeType>& DT, typename GraphT::NodeType* ImmDom = DT.getIDom(W); - // skip all non root nodes that have no dominator - this occures with - // infinite loops. - if (!ImmDom && std::count(DT.Roots.begin(), DT.Roots.end(), W) == 0) - continue; + assert(ImmDom || DT.DomTreeNodes[NULL]); // Get or calculate the node for the immediate dominator DomTreeNodeBase<typename GraphT::NodeType> *IDomNode = DT.getNodeForBlock(ImmDom); - // skip all children that are dominated by a non root node that, by itself, - // has no dominator. - if (!IDomNode) - continue; - // Add a new tree node for this BasicBlock, and link it as a child of // IDomNode DomTreeNodeBase<typename GraphT::NodeType> *C = diff --git a/include/llvm/Analysis/Dominators.h b/include/llvm/Analysis/Dominators.h index 11c0bc2..ad1766c 100644 --- a/include/llvm/Analysis/Dominators.h +++ b/include/llvm/Analysis/Dominators.h @@ -605,17 +605,9 @@ protected: // immediate dominator. NodeT *IDom = getIDom(BB); - // skip all non root nodes that have no dominator - if (!IDom && std::count(this->Roots.begin(), this->Roots.end(), BB) == 0) - return NULL; - + assert(IDom || this->DomTreeNodes[NULL]); DomTreeNodeBase<NodeT> *IDomNode = getNodeForBlock(IDom); - // skip all nodes that are dominated by a non root node that, by itself, - // has no dominator. - if (!IDomNode) - return NULL; - // Add a new tree node for this BasicBlock, and link it as a child of // IDomNode DomTreeNodeBase<NodeT> *C = new DomTreeNodeBase<NodeT>(BB, IDomNode); |