aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorOwen Anderson <resistor@mac.com>2008-05-04 21:07:35 +0000
committerOwen Anderson <resistor@mac.com>2008-05-04 21:07:35 +0000
commit46bb007014414c966586a983dbf24f38490e0f22 (patch)
tree4250b409ee3f01854c356038846cf5464235e759 /include
parent84cb71bbc530033905fe52e455a03dcf7a82e3ae (diff)
downloadexternal_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.h32
-rw-r--r--include/llvm/Analysis/Dominators.h10
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);