Re-land [openmp] Fix warnings when building on Windows with latest MSVC or Clang...
[llvm-project.git] / llvm / test / Transforms / LoopSimplify / unreachable-loop-pred.ll
blobe97c7c29bf57e162de1f4575513eb20b922b147f
1 ; RUN: opt -S -passes=loop-simplify -disable-output -verify-loop-info -verify-dom-info < %s
2 ; PR5235
4 ; When loopsimplify inserts a preheader for this loop, it should add the new
5 ; block to the enclosing loop and not get confused by the unreachable
6 ; bogus loop entry.
8 define void @is_extract_cab() nounwind {
9 entry:
10   br label %header
12 header:                                       ; preds = %if.end206, %cond.end66, %if.end23
13   br label %while.body115
15 while.body115:                                    ; preds = %9, %if.end192, %if.end101
16   br i1 undef, label %header, label %while.body115
18 foo:
19   br label %while.body115
22 ; When loopsimplify generates dedicated exit block for blocks that are landing
23 ; pads (i.e. innerLoopExit in this test), we should not get confused with the
24 ; unreachable pred (unreachableB) to innerLoopExit.
25 define void @baz(i32 %trip) personality ptr @wobble {
26 entry:
27   br label %outerHeader
29 outerHeader:
30   invoke void @foo()
31           to label %innerPreheader unwind label %innerLoopExit
33 innerPreheader:
34   br label %innerH
36 innerH:
37   %tmp50 = invoke ptr undef()
38           to label %innerLatch unwind label %innerLoopExit
40 innerLatch:
41   %cmp = icmp slt i32 %trip, 42
42   br i1 %cmp, label %innerH, label %retblock
44 unreachableB:                                             ; No predecessors!
45   %tmp62 = invoke ptr undef()
46           to label %retblock unwind label %innerLoopExit
48 ; undedicated exit block (preds from inner and outer loop)
49 ; Also has unreachableB as pred.
50 innerLoopExit:
51   %tmp65 = landingpad { ptr, i32 }
52           cleanup
53   invoke void @foo()
54           to label %outerHeader unwind label %unwindblock
56 unwindblock:
57   %tmp67 = landingpad { ptr, i32 }
58           cleanup
59   ret void
61 retblock:
62   ret void
65 ; Function Attrs: nounwind
66 declare ptr @wobble()
68 ; Function Attrs: uwtable
69 declare void @foo()