diff options
Diffstat (limited to 'llvm/test/Transforms/LoopSimplify/unreachable-loop-pred.ll')
-rw-r--r-- | llvm/test/Transforms/LoopSimplify/unreachable-loop-pred.ll | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/llvm/test/Transforms/LoopSimplify/unreachable-loop-pred.ll b/llvm/test/Transforms/LoopSimplify/unreachable-loop-pred.ll new file mode 100644 index 00000000000..1e92ee4ee3b --- /dev/null +++ b/llvm/test/Transforms/LoopSimplify/unreachable-loop-pred.ll @@ -0,0 +1,69 @@ +; RUN: opt -S -loop-simplify -disable-output -verify-loop-info -verify-dom-info < %s +; PR5235 + +; When loopsimplify inserts a preheader for this loop, it should add the new +; block to the enclosing loop and not get confused by the unreachable +; bogus loop entry. + +define void @is_extract_cab() nounwind { +entry: + br label %header + +header: ; preds = %if.end206, %cond.end66, %if.end23 + br label %while.body115 + +while.body115: ; preds = %9, %if.end192, %if.end101 + br i1 undef, label %header, label %while.body115 + +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() |