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
This commit is contained in:
Owen Anderson 2008-05-04 21:07:35 +00:00
parent 84cb71bbc5
commit 46bb007014
4 changed files with 30 additions and 29 deletions

View File

@ -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 =

View File

@ -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);

View File

@ -0,0 +1,3 @@
load_lib llvm.exp
RunLLVMTests [lsort [glob -nocomplain $srcdir/$subdir/*.{ll,llx,c,cpp,tr}]]

View File

@ -0,0 +1,14 @@
; RUN: llvm-as < %s | opt -postdomtree -analyze | grep entry
; PR932
define void @foo(i1 %x) {
entry:
br i1 %x, label %bb1, label %bb0
bb0: ; preds = %entry, bb0
br label %bb0
bb1: ; preds = %entry
br label %bb2
bb2: ; preds = %bb1
ret void
}