summaryrefslogtreecommitdiffstats
path: root/llvm/test/Transforms/LoopSimplify/unreachable-loop-pred.ll
diff options
context:
space:
mode:
authorAnna Thomas <anna@azul.com>2018-01-02 16:25:50 +0000
committerAnna Thomas <anna@azul.com>2018-01-02 16:25:50 +0000
commitbdb94309177f8146f458e2cb8bd6224c2d8f295e (patch)
tree0633321a888705e171b9bb66556e9a319119c692 /llvm/test/Transforms/LoopSimplify/unreachable-loop-pred.ll
parent29e185696674539a8ad1d4b1d65a5419b8b2c777 (diff)
downloadbcm5719-llvm-bdb94309177f8146f458e2cb8bd6224c2d8f295e.tar.gz
bcm5719-llvm-bdb94309177f8146f458e2cb8bd6224c2d8f295e.zip
[BasicBlockUtils] Check for unreachable preds before updating LI in UpdateAnalysisInformation
Summary: We are incorrectly updating the LI when loop-simplify generates dedicated exit blocks for a loop. The issue is that there's an implicit assumption that the Preds passed into UpdateAnalysisInformation are reachable. However, this is not true and breaks LI by incorrectly updating the header of a loop. One such case is when we generate dedicated exits when the exit block is a landing pad (through SplitLandingPadPredecessors). There maybe other cases as well, since we do not guarantee that Preds passed in are reachable basic blocks. The added test case shows how loop-simplify breaks LI for the outer loop (and DT in turn) after we try to generate the LoopSimplifyForm. Reviewers: davide, chandlerc, sanjoy Reviewed By: davide Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D41519 llvm-svn: 321653
Diffstat (limited to 'llvm/test/Transforms/LoopSimplify/unreachable-loop-pred.ll')
-rw-r--r--llvm/test/Transforms/LoopSimplify/unreachable-loop-pred.ll49
1 files changed, 49 insertions, 0 deletions
diff --git a/llvm/test/Transforms/LoopSimplify/unreachable-loop-pred.ll b/llvm/test/Transforms/LoopSimplify/unreachable-loop-pred.ll
index 76b7bb21e46..1e92ee4ee3b 100644
--- a/llvm/test/Transforms/LoopSimplify/unreachable-loop-pred.ll
+++ b/llvm/test/Transforms/LoopSimplify/unreachable-loop-pred.ll
@@ -18,3 +18,52 @@ while.body115: ; preds = %9, %if.end192, %if.
foo:
br label %while.body115
}
+
+; When loopsimplify generates dedicated exit block for blocks that are landing
+; pads (i.e. innerLoopExit in this test), we should not get confused with the
+; unreachable pred (unreachableB) to innerLoopExit.
+define align 8 void @baz(i32 %trip) personality i32* ()* @wobble {
+entry:
+ br label %outerHeader
+
+outerHeader:
+ invoke void @foo()
+ to label %innerPreheader unwind label %innerLoopExit
+
+innerPreheader:
+ br label %innerH
+
+innerH:
+ %tmp50 = invoke i8 * undef()
+ to label %innerLatch unwind label %innerLoopExit
+
+innerLatch:
+ %cmp = icmp slt i32 %trip, 42
+ br i1 %cmp, label %innerH, label %retblock
+
+unreachableB: ; No predecessors!
+ %tmp62 = invoke i8 * undef()
+ to label %retblock unwind label %innerLoopExit
+
+; undedicated exit block (preds from inner and outer loop)
+; Also has unreachableB as pred.
+innerLoopExit:
+ %tmp65 = landingpad { i8*, i32 }
+ cleanup
+ invoke void @foo()
+ to label %outerHeader unwind label %unwindblock
+
+unwindblock:
+ %tmp67 = landingpad { i8*, i32 }
+ cleanup
+ ret void
+
+retblock:
+ ret void
+}
+
+; Function Attrs: nounwind
+declare i32* @wobble()
+
+; Function Attrs: uwtable
+declare void @foo()
OpenPOWER on IntegriCloud