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