forked from OSchip/llvm-project
Fix PR6047
Nodes that had children outside of the post dominator tree (infinite loops) where removed from the post dominator tree. This seems to be wrong. Leave them in the tree. llvm-svn: 93633
This commit is contained in:
parent
53da3f8da8
commit
b478d3e0fc
|
@ -262,29 +262,17 @@ void Calculate(DominatorTreeBase<typename GraphTraits<NodeT>::NodeType>& DT,
|
|||
DT.Info[W];
|
||||
|
||||
// Step #2: Calculate the semidominators of all vertices
|
||||
bool HasChildOutsideDFS = false;
|
||||
|
||||
// initialize the semi dominator to point to the parent node
|
||||
WInfo.Semi = WInfo.Parent;
|
||||
for (typename GraphTraits<Inverse<NodeT> >::ChildIteratorType CI =
|
||||
GraphTraits<Inverse<NodeT> >::child_begin(W),
|
||||
E = GraphTraits<Inverse<NodeT> >::child_end(W); CI != E; ++CI) {
|
||||
E = GraphTraits<Inverse<NodeT> >::child_end(W); CI != E; ++CI)
|
||||
if (DT.Info.count(*CI)) { // Only if this predecessor is reachable!
|
||||
unsigned SemiU = DT.Info[Eval<GraphT>(DT, *CI)].Semi;
|
||||
if (SemiU < WInfo.Semi)
|
||||
WInfo.Semi = SemiU;
|
||||
}
|
||||
else {
|
||||
// if the child has no DFS number it is not post-dominated by any exit,
|
||||
// and so is the current block.
|
||||
HasChildOutsideDFS = true;
|
||||
}
|
||||
}
|
||||
|
||||
// if some child has no DFS number it is not post-dominated by any exit,
|
||||
// and so is the current block.
|
||||
if (DT.isPostDominator() && HasChildOutsideDFS)
|
||||
WInfo.Semi = 0;
|
||||
|
||||
DT.Info[DT.Vertex[WInfo.Semi]].Bucket.push_back(W);
|
||||
|
||||
|
|
|
@ -0,0 +1,15 @@
|
|||
; RUN: opt < %s -postdomtree -analyze | FileCheck %s
|
||||
define internal void @f() {
|
||||
entry:
|
||||
br i1 undef, label %bb35, label %bb3.i
|
||||
|
||||
bb3.i:
|
||||
br label %bb3.i
|
||||
|
||||
bb35.loopexit3:
|
||||
br label %bb35
|
||||
|
||||
bb35:
|
||||
ret void
|
||||
}
|
||||
; CHECK: [3] %entry
|
|
@ -0,0 +1,19 @@
|
|||
; RUN: opt < %s -postdomtree -analyze | FileCheck %s
|
||||
define internal void @f() {
|
||||
entry:
|
||||
br i1 undef, label %a, label %bb3.i
|
||||
|
||||
a:
|
||||
br i1 undef, label %bb35, label %bb3.i
|
||||
|
||||
bb3.i:
|
||||
br label %bb3.i
|
||||
|
||||
|
||||
bb35.loopexit3:
|
||||
br label %bb35
|
||||
|
||||
bb35:
|
||||
ret void
|
||||
}
|
||||
; CHECK: [4] %entry
|
|
@ -0,0 +1,147 @@
|
|||
; RUN: opt < %s -postdomtree -analyze | FileCheck %s
|
||||
define internal void @f() {
|
||||
entry:
|
||||
br i1 undef, label %bb35, label %bb3.i
|
||||
|
||||
bb3.i:
|
||||
br label %bb3.i
|
||||
|
||||
bb:
|
||||
br label %bb35
|
||||
|
||||
bb.i:
|
||||
br label %bb35
|
||||
|
||||
_float32_unpack.exit:
|
||||
br label %bb35
|
||||
|
||||
bb.i5:
|
||||
br label %bb35
|
||||
|
||||
_float32_unpack.exit8:
|
||||
br label %bb35
|
||||
|
||||
bb32.preheader:
|
||||
br label %bb35
|
||||
|
||||
bb3:
|
||||
br label %bb35
|
||||
|
||||
bb3.split.us:
|
||||
br label %bb35
|
||||
|
||||
bb.i4.us:
|
||||
br label %bb35
|
||||
|
||||
bb7.i.us:
|
||||
br label %bb35
|
||||
|
||||
bb.i4.us.backedge:
|
||||
br label %bb35
|
||||
|
||||
bb1.i.us:
|
||||
br label %bb35
|
||||
|
||||
bb6.i.us:
|
||||
br label %bb35
|
||||
|
||||
bb4.i.us:
|
||||
br label %bb35
|
||||
|
||||
bb8.i.us:
|
||||
br label %bb35
|
||||
|
||||
bb3.i.loopexit.us:
|
||||
br label %bb35
|
||||
|
||||
bb.nph21:
|
||||
br label %bb35
|
||||
|
||||
bb4:
|
||||
br label %bb35
|
||||
|
||||
bb5:
|
||||
br label %bb35
|
||||
|
||||
bb14.preheader:
|
||||
br label %bb35
|
||||
|
||||
bb.nph18:
|
||||
br label %bb35
|
||||
|
||||
bb8.us.preheader:
|
||||
br label %bb35
|
||||
|
||||
bb8.preheader:
|
||||
br label %bb35
|
||||
|
||||
bb8.us:
|
||||
br label %bb35
|
||||
|
||||
bb8:
|
||||
br label %bb35
|
||||
|
||||
bb15.loopexit:
|
||||
br label %bb35
|
||||
|
||||
bb15.loopexit2:
|
||||
br label %bb35
|
||||
|
||||
bb15:
|
||||
br label %bb35
|
||||
|
||||
bb16:
|
||||
br label %bb35
|
||||
|
||||
bb17.loopexit.split:
|
||||
br label %bb35
|
||||
|
||||
bb.nph14:
|
||||
br label %bb35
|
||||
|
||||
bb19:
|
||||
br label %bb35
|
||||
|
||||
bb20:
|
||||
br label %bb35
|
||||
|
||||
bb29.preheader:
|
||||
br label %bb35
|
||||
|
||||
bb.nph:
|
||||
br label %bb35
|
||||
|
||||
bb23.us.preheader:
|
||||
br label %bb35
|
||||
|
||||
bb23.preheader:
|
||||
br label %bb35
|
||||
|
||||
bb23.us:
|
||||
br label %bb35
|
||||
|
||||
bb23:
|
||||
br label %bb35
|
||||
|
||||
bb30.loopexit:
|
||||
br label %bb35
|
||||
|
||||
bb30.loopexit1:
|
||||
br label %bb35
|
||||
|
||||
bb30:
|
||||
br label %bb35
|
||||
|
||||
bb31:
|
||||
br label %bb35
|
||||
|
||||
bb35.loopexit:
|
||||
br label %bb35
|
||||
|
||||
bb35.loopexit3:
|
||||
br label %bb35
|
||||
|
||||
bb35:
|
||||
ret void
|
||||
}
|
||||
; CHECK: [3] %entry
|
|
@ -0,0 +1,24 @@
|
|||
; RUN: opt < %s -postdomtree -analyze | FileCheck %s
|
||||
define internal void @f() {
|
||||
entry:
|
||||
br i1 1, label %a, label %b
|
||||
|
||||
a:
|
||||
br label %c
|
||||
|
||||
b:
|
||||
br label %c
|
||||
|
||||
c:
|
||||
br i1 undef, label %bb35, label %bb3.i
|
||||
|
||||
bb3.i:
|
||||
br label %bb3.i
|
||||
|
||||
bb35.loopexit3:
|
||||
br label %bb35
|
||||
|
||||
bb35:
|
||||
ret void
|
||||
}
|
||||
; CHECK: [4] %entry
|
Loading…
Reference in New Issue