Home | History | Annotate | Download | only in SimpleLoopUnswitch
      1 ; RUN: opt -passes='loop(unswitch),verify<loops>' -enable-nontrivial-unswitch -S < %s | FileCheck %s
      2 ; RUN: opt -simple-loop-unswitch -enable-nontrivial-unswitch -S < %s | FileCheck %s
      3 
      4 declare i32 @a()
      5 declare i32 @b()
      6 declare i32 @c()
      7 declare i32 @d()
      8 
      9 declare void @sink1(i32)
     10 declare void @sink2(i32)
     11 
     12 declare i1 @cond()
     13 declare i32 @cond.i32()
     14 
     15 ; Negative test: we cannot unswitch convergent calls.
     16 define void @test_no_unswitch_convergent(i1* %ptr, i1 %cond) {
     17 ; CHECK-LABEL: @test_no_unswitch_convergent(
     18 entry:
     19   br label %loop_begin
     20 ; CHECK-NEXT:  entry:
     21 ; CHECK-NEXT:    br label %loop_begin
     22 ;
     23 ; We shouldn't have unswitched into any other block either.
     24 ; CHECK-NOT:     br i1 %cond
     25 
     26 loop_begin:
     27   br i1 %cond, label %loop_a, label %loop_b
     28 ; CHECK:       loop_begin:
     29 ; CHECK-NEXT:    br i1 %cond, label %loop_a, label %loop_b
     30 
     31 loop_a:
     32   call i32 @a() convergent
     33   br label %loop_latch
     34 
     35 loop_b:
     36   call i32 @b()
     37   br label %loop_latch
     38 
     39 loop_latch:
     40   %v = load i1, i1* %ptr
     41   br i1 %v, label %loop_begin, label %loop_exit
     42 
     43 loop_exit:
     44   ret void
     45 }
     46 
     47 ; Negative test: we cannot unswitch noduplicate calls.
     48 define void @test_no_unswitch_noduplicate(i1* %ptr, i1 %cond) {
     49 ; CHECK-LABEL: @test_no_unswitch_noduplicate(
     50 entry:
     51   br label %loop_begin
     52 ; CHECK-NEXT:  entry:
     53 ; CHECK-NEXT:    br label %loop_begin
     54 ;
     55 ; We shouldn't have unswitched into any other block either.
     56 ; CHECK-NOT:     br i1 %cond
     57 
     58 loop_begin:
     59   br i1 %cond, label %loop_a, label %loop_b
     60 ; CHECK:       loop_begin:
     61 ; CHECK-NEXT:    br i1 %cond, label %loop_a, label %loop_b
     62 
     63 loop_a:
     64   call i32 @a() noduplicate
     65   br label %loop_latch
     66 
     67 loop_b:
     68   call i32 @b()
     69   br label %loop_latch
     70 
     71 loop_latch:
     72   %v = load i1, i1* %ptr
     73   br i1 %v, label %loop_begin, label %loop_exit
     74 
     75 loop_exit:
     76   ret void
     77 }
     78 
     79 declare i32 @__CxxFrameHandler3(...)
     80 
     81 ; Negative test: we cannot unswitch when tokens are used across blocks as we
     82 ; might introduce PHIs.
     83 define void @test_no_unswitch_cross_block_token(i1* %ptr, i1 %cond) nounwind personality i32 (...)* @__CxxFrameHandler3 {
     84 ; CHECK-LABEL: @test_no_unswitch_cross_block_token(
     85 entry:
     86   br label %loop_begin
     87 ; CHECK-NEXT:  entry:
     88 ; CHECK-NEXT:    br label %loop_begin
     89 ;
     90 ; We shouldn't have unswitched into any other block either.
     91 ; CHECK-NOT:     br i1 %cond
     92 
     93 loop_begin:
     94   br i1 %cond, label %loop_a, label %loop_b
     95 ; CHECK:       loop_begin:
     96 ; CHECK-NEXT:    br i1 %cond, label %loop_a, label %loop_b
     97 
     98 loop_a:
     99   call i32 @a()
    100   br label %loop_cont
    101 
    102 loop_b:
    103   call i32 @b()
    104   br label %loop_cont
    105 
    106 loop_cont:
    107   invoke i32 @a()
    108           to label %loop_latch unwind label %loop_catch
    109 
    110 loop_latch:
    111   br label %loop_begin
    112 
    113 loop_catch:
    114   %catch = catchswitch within none [label %loop_catch_latch, label %loop_exit] unwind to caller
    115 
    116 loop_catch_latch:
    117   %catchpad_latch = catchpad within %catch []
    118   catchret from %catchpad_latch to label %loop_begin
    119 
    120 loop_exit:
    121   %catchpad_exit = catchpad within %catch []
    122   catchret from %catchpad_exit to label %exit
    123 
    124 exit:
    125   ret void
    126 }
    127 
    128 
    129 ; Non-trivial loop unswitching where there are two distinct trivial conditions
    130 ; to unswitch within the loop.
    131 define i32 @test1(i1* %ptr, i1 %cond1, i1 %cond2) {
    132 ; CHECK-LABEL: @test1(
    133 entry:
    134   br label %loop_begin
    135 ; CHECK-NEXT:  entry:
    136 ; CHECK-NEXT:    br i1 %cond1, label %entry.split.us, label %entry.split
    137 
    138 loop_begin:
    139   br i1 %cond1, label %loop_a, label %loop_b
    140 
    141 loop_a:
    142   call i32 @a()
    143   br label %latch
    144 ; The 'loop_a' unswitched loop.
    145 ;
    146 ; CHECK:       entry.split.us:
    147 ; CHECK-NEXT:    br label %loop_begin.us
    148 ;
    149 ; CHECK:       loop_begin.us:
    150 ; CHECK-NEXT:    br label %loop_a.us
    151 ;
    152 ; CHECK:       loop_a.us:
    153 ; CHECK-NEXT:    call i32 @a()
    154 ; CHECK-NEXT:    br label %latch.us
    155 ;
    156 ; CHECK:       latch.us:
    157 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
    158 ; CHECK-NEXT:    br i1 %[[V]], label %loop_begin.us, label %loop_exit.split.us
    159 ;
    160 ; CHECK:       loop_exit.split.us:
    161 ; CHECK-NEXT:    br label %loop_exit
    162 
    163 loop_b:
    164   br i1 %cond2, label %loop_b_a, label %loop_b_b
    165 ; The second unswitched condition.
    166 ;
    167 ; CHECK:       entry.split:
    168 ; CHECK-NEXT:    br i1 %cond2, label %entry.split.split.us, label %entry.split.split
    169 
    170 loop_b_a:
    171   call i32 @b()
    172   br label %latch
    173 ; The 'loop_b_a' unswitched loop.
    174 ;
    175 ; CHECK:       entry.split.split.us:
    176 ; CHECK-NEXT:    br label %loop_begin.us1
    177 ;
    178 ; CHECK:       loop_begin.us1:
    179 ; CHECK-NEXT:    br label %loop_b.us
    180 ;
    181 ; CHECK:       loop_b.us:
    182 ; CHECK-NEXT:    br label %loop_b_a.us
    183 ;
    184 ; CHECK:       loop_b_a.us:
    185 ; CHECK-NEXT:    call i32 @b()
    186 ; CHECK-NEXT:    br label %latch.us2
    187 ;
    188 ; CHECK:       latch.us2:
    189 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
    190 ; CHECK-NEXT:    br i1 %[[V]], label %loop_begin.us1, label %loop_exit.split.split.us
    191 ;
    192 ; CHECK:       loop_exit.split.split.us:
    193 ; CHECK-NEXT:    br label %loop_exit.split
    194 
    195 loop_b_b:
    196   call i32 @c()
    197   br label %latch
    198 ; The 'loop_b_b' unswitched loop.
    199 ;
    200 ; CHECK:       entry.split.split:
    201 ; CHECK-NEXT:    br label %loop_begin
    202 ;
    203 ; CHECK:       loop_begin:
    204 ; CHECK-NEXT:    br label %loop_b
    205 ;
    206 ; CHECK:       loop_b:
    207 ; CHECK-NEXT:    br label %loop_b_b
    208 ;
    209 ; CHECK:       loop_b_b:
    210 ; CHECK-NEXT:    call i32 @c()
    211 ; CHECK-NEXT:    br label %latch
    212 ;
    213 ; CHECK:       latch:
    214 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
    215 ; CHECK-NEXT:    br i1 %[[V]], label %loop_begin, label %loop_exit.split.split
    216 ;
    217 ; CHECK:       loop_exit.split.split:
    218 ; CHECK-NEXT:    br label %loop_exit.split
    219 
    220 latch:
    221   %v = load i1, i1* %ptr
    222   br i1 %v, label %loop_begin, label %loop_exit
    223 
    224 loop_exit:
    225   ret i32 0
    226 ; CHECK:       loop_exit.split:
    227 ; CHECK-NEXT:    br label %loop_exit
    228 ;
    229 ; CHECK:       loop_exit:
    230 ; CHECK-NEXT:    ret
    231 }
    232 
    233 define i32 @test2(i1* %ptr, i1 %cond1, i32* %a.ptr, i32* %b.ptr, i32* %c.ptr) {
    234 ; CHECK-LABEL: @test2(
    235 entry:
    236   br label %loop_begin
    237 ; CHECK-NEXT:  entry:
    238 ; CHECK-NEXT:    br i1 %cond1, label %entry.split.us, label %entry.split
    239 
    240 loop_begin:
    241   %v = load i1, i1* %ptr
    242   br i1 %cond1, label %loop_a, label %loop_b
    243 
    244 loop_a:
    245   %a = load i32, i32* %a.ptr
    246   %ac = load i32, i32* %c.ptr
    247   br i1 %v, label %loop_begin, label %loop_exit
    248 ; The 'loop_a' unswitched loop.
    249 ;
    250 ; CHECK:       entry.split.us:
    251 ; CHECK-NEXT:    br label %loop_begin.us
    252 ;
    253 ; CHECK:       loop_begin.us:
    254 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
    255 ; CHECK-NEXT:    br label %loop_a.us
    256 ;
    257 ; CHECK:       loop_a.us:
    258 ; CHECK-NEXT:    %[[A:.*]] = load i32, i32* %a.ptr
    259 ; CHECK-NEXT:    %[[AC:.*]] = load i32, i32* %c.ptr
    260 ; CHECK-NEXT:    br i1 %[[V]], label %loop_begin.backedge.us, label %loop_exit.split.us
    261 ;
    262 ; CHECK:       loop_exit.split.us:
    263 ; CHECK-NEXT:    %[[A_LCSSA:.*]] = phi i32 [ %[[A]], %loop_a.us ]
    264 ; CHECK-NEXT:    %[[AC_LCSSA:.*]] = phi i32 [ %[[AC]], %loop_a.us ]
    265 ; CHECK-NEXT:    br label %loop_exit
    266 
    267 loop_b:
    268   %b = load i32, i32* %b.ptr
    269   %bc = load i32, i32* %c.ptr
    270   br i1 %v, label %loop_begin, label %loop_exit
    271 ; The 'loop_b' unswitched loop.
    272 ;
    273 ; CHECK:       entry.split:
    274 ; CHECK-NEXT:    br label %loop_begin
    275 ;
    276 ; CHECK:       loop_begin:
    277 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
    278 ; CHECK-NEXT:    br label %loop_b
    279 ;
    280 ; CHECK:       loop_b:
    281 ; CHECK-NEXT:    %[[B:.*]] = load i32, i32* %b.ptr
    282 ; CHECK-NEXT:    %[[BC:.*]] = load i32, i32* %c.ptr
    283 ; CHECK-NEXT:    br i1 %[[V]], label %loop_begin.backedge, label %loop_exit.split
    284 ;
    285 ; CHECK:       loop_exit.split:
    286 ; CHECK-NEXT:    %[[B_LCSSA:.*]] = phi i32 [ %[[B]], %loop_b ]
    287 ; CHECK-NEXT:    %[[BC_LCSSA:.*]] = phi i32 [ %[[BC]], %loop_b ]
    288 ; CHECK-NEXT:    br label %loop_exit
    289 
    290 loop_exit:
    291   %ab.phi = phi i32 [ %a, %loop_a ], [ %b, %loop_b ]
    292   %c.phi = phi i32 [ %ac, %loop_a ], [ %bc, %loop_b ]
    293   %result = add i32 %ab.phi, %c.phi
    294   ret i32 %result
    295 ; CHECK:       loop_exit:
    296 ; CHECK-NEXT:    %[[AB_PHI:.*]] = phi i32 [ %[[B_LCSSA]], %loop_exit.split ], [ %[[A_LCSSA]], %loop_exit.split.us ]
    297 ; CHECK-NEXT:    %[[C_PHI:.*]] = phi i32 [ %[[BC_LCSSA]], %loop_exit.split ], [ %[[AC_LCSSA]], %loop_exit.split.us ]
    298 ; CHECK-NEXT:    %[[RESULT:.*]] = add i32 %[[AB_PHI]], %[[C_PHI]]
    299 ; CHECK-NEXT:    ret i32 %[[RESULT]]
    300 }
    301 
    302 ; Test a non-trivial unswitch of an exiting edge to an exit block with other
    303 ; in-loop predecessors.
    304 define i32 @test3a(i1* %ptr, i1 %cond1, i32* %a.ptr, i32* %b.ptr) {
    305 ; CHECK-LABEL: @test3a(
    306 entry:
    307   br label %loop_begin
    308 ; CHECK-NEXT:  entry:
    309 ; CHECK-NEXT:    br i1 %cond1, label %entry.split.us, label %entry.split
    310 
    311 loop_begin:
    312   %v = load i1, i1* %ptr
    313   %a = load i32, i32* %a.ptr
    314   br i1 %cond1, label %loop_exit, label %loop_b
    315 ; The 'loop_exit' clone.
    316 ;
    317 ; CHECK:       entry.split.us:
    318 ; CHECK-NEXT:    br label %loop_begin.us
    319 ;
    320 ; CHECK:       loop_begin.us:
    321 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
    322 ; CHECK-NEXT:    %[[A:.*]] = load i32, i32* %a.ptr
    323 ; CHECK-NEXT:    br label %loop_exit.split.us
    324 ;
    325 ; CHECK:       loop_exit.split.us:
    326 ; CHECK-NEXT:    %[[A_LCSSA:.*]] = phi i32 [ %[[A]], %loop_begin.us ]
    327 ; CHECK-NEXT:    br label %loop_exit
    328 
    329 loop_b:
    330   %b = load i32, i32* %b.ptr
    331   br i1 %v, label %loop_begin, label %loop_exit
    332 ; The 'loop_b' unswitched loop.
    333 ;
    334 ; CHECK:       entry.split:
    335 ; CHECK-NEXT:    br label %loop_begin
    336 ;
    337 ; CHECK:       loop_begin:
    338 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
    339 ; CHECK-NEXT:    %[[A:.*]] = load i32, i32* %a.ptr
    340 ; CHECK-NEXT:    br label %loop_b
    341 ;
    342 ; CHECK:       loop_b:
    343 ; CHECK-NEXT:    %[[B:.*]] = load i32, i32* %b.ptr
    344 ; CHECK-NEXT:    br i1 %[[V]], label %loop_begin, label %loop_exit.split
    345 ;
    346 ; CHECK:       loop_exit.split:
    347 ; CHECK-NEXT:    %[[B_LCSSA:.*]] = phi i32 [ %[[B]], %loop_b ]
    348 ; CHECK-NEXT:    br label %loop_exit
    349 
    350 loop_exit:
    351   %ab.phi = phi i32 [ %a, %loop_begin ], [ %b, %loop_b ]
    352   ret i32 %ab.phi
    353 ; CHECK:       loop_exit:
    354 ; CHECK-NEXT:    %[[AB_PHI:.*]] = phi i32 [ %[[B_LCSSA]], %loop_exit.split ], [ %[[A_LCSSA]], %loop_exit.split.us ]
    355 ; CHECK-NEXT:    ret i32 %[[AB_PHI]]
    356 }
    357 
    358 ; Test a non-trivial unswitch of an exiting edge to an exit block with other
    359 ; in-loop predecessors. This is the same as @test3a but with the reversed order
    360 ; of successors so that the exiting edge is *not* the cloned edge.
    361 define i32 @test3b(i1* %ptr, i1 %cond1, i32* %a.ptr, i32* %b.ptr) {
    362 ; CHECK-LABEL: @test3b(
    363 entry:
    364   br label %loop_begin
    365 ; CHECK-NEXT:  entry:
    366 ; CHECK-NEXT:    br i1 %cond1, label %entry.split.us, label %entry.split
    367 
    368 loop_begin:
    369   %v = load i1, i1* %ptr
    370   %a = load i32, i32* %a.ptr
    371   br i1 %cond1, label %loop_b, label %loop_exit
    372 ; The 'loop_b' unswitched loop.
    373 ;
    374 ; CHECK:       entry.split.us:
    375 ; CHECK-NEXT:    br label %loop_begin.us
    376 ;
    377 ; CHECK:       loop_begin.us:
    378 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
    379 ; CHECK-NEXT:    %[[A:.*]] = load i32, i32* %a.ptr
    380 ; CHECK-NEXT:    br label %loop_b.us
    381 ;
    382 ; CHECK:       loop_b.us:
    383 ; CHECK-NEXT:    %[[B:.*]] = load i32, i32* %b.ptr
    384 ; CHECK-NEXT:    br i1 %[[V]], label %loop_begin.us, label %loop_exit.split.us
    385 ;
    386 ; CHECK:       loop_exit.split.us:
    387 ; CHECK-NEXT:    %[[B_LCSSA:.*]] = phi i32 [ %[[B]], %loop_b.us ]
    388 ; CHECK-NEXT:    br label %loop_exit
    389 
    390 loop_b:
    391   %b = load i32, i32* %b.ptr
    392   br i1 %v, label %loop_begin, label %loop_exit
    393 ; The original loop, now non-looping due to unswitching..
    394 ;
    395 ; CHECK:       entry.split:
    396 ; CHECK-NEXT:    br label %loop_begin
    397 ;
    398 ; CHECK:       loop_begin:
    399 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
    400 ; CHECK-NEXT:    %[[A:.*]] = load i32, i32* %a.ptr
    401 ; CHECK-NEXT:    br label %loop_exit.split
    402 ;
    403 ; CHECK:       loop_exit.split:
    404 ; CHECK-NEXT:    br label %loop_exit
    405 
    406 loop_exit:
    407   %ab.phi = phi i32 [ %b, %loop_b ], [ %a, %loop_begin ]
    408   ret i32 %ab.phi
    409 ; CHECK:       loop_exit:
    410 ; CHECK-NEXT:    %[[AB_PHI:.*]] = phi i32 [ %[[A]], %loop_exit.split ], [ %[[B_LCSSA]], %loop_exit.split.us ]
    411 ; CHECK-NEXT:    ret i32 %[[AB_PHI]]
    412 }
    413 
    414 ; Test a non-trivial unswitch of an exiting edge to an exit block with no other
    415 ; in-loop predecessors.
    416 define void @test4a(i1* %ptr, i1 %cond1, i32* %a.ptr, i32* %b.ptr) {
    417 ; CHECK-LABEL: @test4a(
    418 entry:
    419   br label %loop_begin
    420 ; CHECK-NEXT:  entry:
    421 ; CHECK-NEXT:    br i1 %cond1, label %entry.split.us, label %entry.split
    422 
    423 loop_begin:
    424   %v = load i1, i1* %ptr
    425   %a = load i32, i32* %a.ptr
    426   br i1 %cond1, label %loop_exit1, label %loop_b
    427 ; The 'loop_exit' clone.
    428 ;
    429 ; CHECK:       entry.split.us:
    430 ; CHECK-NEXT:    br label %loop_begin.us
    431 ;
    432 ; CHECK:       loop_begin.us:
    433 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
    434 ; CHECK-NEXT:    %[[A:.*]] = load i32, i32* %a.ptr
    435 ; CHECK-NEXT:    br label %loop_exit1.split.us
    436 ;
    437 ; CHECK:       loop_exit1.split.us:
    438 ; CHECK-NEXT:    %[[A_LCSSA:.*]] = phi i32 [ %[[A]], %loop_begin.us ]
    439 ; CHECK-NEXT:    br label %loop_exit1
    440 
    441 loop_b:
    442   %b = load i32, i32* %b.ptr
    443   br i1 %v, label %loop_begin, label %loop_exit2
    444 ; The 'loop_b' unswitched loop.
    445 ;
    446 ; CHECK:       entry.split:
    447 ; CHECK-NEXT:    br label %loop_begin
    448 ;
    449 ; CHECK:       loop_begin:
    450 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
    451 ; CHECK-NEXT:    %[[A:.*]] = load i32, i32* %a.ptr
    452 ; CHECK-NEXT:    br label %loop_b
    453 ;
    454 ; CHECK:       loop_b:
    455 ; CHECK-NEXT:    %[[B:.*]] = load i32, i32* %b.ptr
    456 ; CHECK-NEXT:    br i1 %[[V]], label %loop_begin, label %loop_exit2
    457 
    458 loop_exit1:
    459   %a.phi = phi i32 [ %a, %loop_begin ]
    460   call void @sink1(i32 %a.phi)
    461   ret void
    462 ; CHECK:       loop_exit1:
    463 ; CHECK-NEXT:    call void @sink1(i32 %[[A_LCSSA]])
    464 ; CHECK-NEXT:    ret void
    465 
    466 loop_exit2:
    467   %b.phi = phi i32 [ %b, %loop_b ]
    468   call void @sink2(i32 %b.phi)
    469   ret void
    470 ; CHECK:       loop_exit2:
    471 ; CHECK-NEXT:    %[[B_LCSSA:.*]] = phi i32 [ %[[B]], %loop_b ]
    472 ; CHECK-NEXT:    call void @sink2(i32 %[[B_LCSSA]])
    473 ; CHECK-NEXT:    ret void
    474 }
    475 
    476 ; Test a non-trivial unswitch of an exiting edge to an exit block with no other
    477 ; in-loop predecessors. This is the same as @test4a but with the edges reversed
    478 ; so that the exiting edge is *not* the cloned edge.
    479 define void @test4b(i1* %ptr, i1 %cond1, i32* %a.ptr, i32* %b.ptr) {
    480 ; CHECK-LABEL: @test4b(
    481 entry:
    482   br label %loop_begin
    483 ; CHECK-NEXT:  entry:
    484 ; CHECK-NEXT:    br i1 %cond1, label %entry.split.us, label %entry.split
    485 
    486 loop_begin:
    487   %v = load i1, i1* %ptr
    488   %a = load i32, i32* %a.ptr
    489   br i1 %cond1, label %loop_b, label %loop_exit1
    490 ; The 'loop_b' clone.
    491 ;
    492 ; CHECK:       entry.split.us:
    493 ; CHECK-NEXT:    br label %loop_begin.us
    494 ;
    495 ; CHECK:       loop_begin.us:
    496 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
    497 ; CHECK-NEXT:    %[[A:.*]] = load i32, i32* %a.ptr
    498 ; CHECK-NEXT:    br label %loop_b.us
    499 ;
    500 ; CHECK:       loop_b.us:
    501 ; CHECK-NEXT:    %[[B:.*]] = load i32, i32* %b.ptr
    502 ; CHECK-NEXT:    br i1 %[[V]], label %loop_begin.us, label %loop_exit2.split.us
    503 ;
    504 ; CHECK:       loop_exit2.split.us:
    505 ; CHECK-NEXT:    %[[B_LCSSA:.*]] = phi i32 [ %[[B]], %loop_b.us ]
    506 ; CHECK-NEXT:    br label %loop_exit2
    507 
    508 loop_b:
    509   %b = load i32, i32* %b.ptr
    510   br i1 %v, label %loop_begin, label %loop_exit2
    511 ; The 'loop_exit' unswitched path.
    512 ;
    513 ; CHECK:       entry.split:
    514 ; CHECK-NEXT:    br label %loop_begin
    515 ;
    516 ; CHECK:       loop_begin:
    517 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
    518 ; CHECK-NEXT:    %[[A:.*]] = load i32, i32* %a.ptr
    519 ; CHECK-NEXT:    br label %loop_exit1
    520 
    521 loop_exit1:
    522   %a.phi = phi i32 [ %a, %loop_begin ]
    523   call void @sink1(i32 %a.phi)
    524   ret void
    525 ; CHECK:       loop_exit1:
    526 ; CHECK-NEXT:    %[[A_PHI:.*]] = phi i32 [ %[[A]], %loop_begin ]
    527 ; CHECK-NEXT:    call void @sink1(i32 %[[A_PHI]])
    528 ; CHECK-NEXT:    ret void
    529 
    530 loop_exit2:
    531   %b.phi = phi i32 [ %b, %loop_b ]
    532   call void @sink2(i32 %b.phi)
    533   ret void
    534 ; CHECK:       loop_exit2:
    535 ; CHECK-NEXT:    call void @sink2(i32 %[[B_LCSSA]])
    536 ; CHECK-NEXT:    ret void
    537 }
    538 
    539 ; Test a non-trivial unswitch of an exiting edge to an exit block with no other
    540 ; in-loop predecessors. This is the same as @test4a but with a common merge
    541 ; block after the independent loop exits. This requires a different structural
    542 ; update to the dominator tree.
    543 define void @test4c(i1* %ptr, i1 %cond1, i32* %a.ptr, i32* %b.ptr) {
    544 ; CHECK-LABEL: @test4c(
    545 entry:
    546   br label %loop_begin
    547 ; CHECK-NEXT:  entry:
    548 ; CHECK-NEXT:    br i1 %cond1, label %entry.split.us, label %entry.split
    549 
    550 loop_begin:
    551   %v = load i1, i1* %ptr
    552   %a = load i32, i32* %a.ptr
    553   br i1 %cond1, label %loop_exit1, label %loop_b
    554 ; The 'loop_exit' clone.
    555 ;
    556 ; CHECK:       entry.split.us:
    557 ; CHECK-NEXT:    br label %loop_begin.us
    558 ;
    559 ; CHECK:       loop_begin.us:
    560 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
    561 ; CHECK-NEXT:    %[[A:.*]] = load i32, i32* %a.ptr
    562 ; CHECK-NEXT:    br label %loop_exit1.split.us
    563 ;
    564 ; CHECK:       loop_exit1.split.us:
    565 ; CHECK-NEXT:    %[[A_LCSSA:.*]] = phi i32 [ %[[A]], %loop_begin.us ]
    566 ; CHECK-NEXT:    br label %loop_exit1
    567 
    568 loop_b:
    569   %b = load i32, i32* %b.ptr
    570   br i1 %v, label %loop_begin, label %loop_exit2
    571 ; The 'loop_b' unswitched loop.
    572 ;
    573 ; CHECK:       entry.split:
    574 ; CHECK-NEXT:    br label %loop_begin
    575 ;
    576 ; CHECK:       loop_begin:
    577 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
    578 ; CHECK-NEXT:    %[[A:.*]] = load i32, i32* %a.ptr
    579 ; CHECK-NEXT:    br label %loop_b
    580 ;
    581 ; CHECK:       loop_b:
    582 ; CHECK-NEXT:    %[[B:.*]] = load i32, i32* %b.ptr
    583 ; CHECK-NEXT:    br i1 %[[V]], label %loop_begin, label %loop_exit2
    584 
    585 loop_exit1:
    586   %a.phi = phi i32 [ %a, %loop_begin ]
    587   call void @sink1(i32 %a.phi)
    588   br label %exit
    589 ; CHECK:       loop_exit1:
    590 ; CHECK-NEXT:    call void @sink1(i32 %[[A_LCSSA]])
    591 ; CHECK-NEXT:    br label %exit
    592 
    593 loop_exit2:
    594   %b.phi = phi i32 [ %b, %loop_b ]
    595   call void @sink2(i32 %b.phi)
    596   br label %exit
    597 ; CHECK:       loop_exit2:
    598 ; CHECK-NEXT:    %[[B_LCSSA:.*]] = phi i32 [ %[[B]], %loop_b ]
    599 ; CHECK-NEXT:    call void @sink2(i32 %[[B_LCSSA]])
    600 ; CHECK-NEXT:    br label %exit
    601 
    602 exit:
    603   ret void
    604 ; CHECK:       exit:
    605 ; CHECK-NEXT:    ret void
    606 }
    607 
    608 ; Test that we can unswitch a condition out of multiple layers of a loop nest.
    609 define i32 @test5(i1* %ptr, i1 %cond1, i32* %a.ptr, i32* %b.ptr) {
    610 ; CHECK-LABEL: @test5(
    611 entry:
    612   br label %loop_begin
    613 ; CHECK-NEXT:  entry:
    614 ; CHECK-NEXT:    br i1 %cond1, label %loop_begin.split.us, label %entry.split
    615 ;
    616 ; CHECK:       entry.split:
    617 ; CHECK-NEXT:    br label %loop_begin
    618 ;
    619 ; CHECK:       loop_begin:
    620 ; CHECK-NEXT:    br label %loop_begin.split
    621 
    622 loop_begin:
    623   br label %inner_loop_begin
    624 
    625 inner_loop_begin:
    626   %v = load i1, i1* %ptr
    627   %a = load i32, i32* %a.ptr
    628   br i1 %cond1, label %loop_exit, label %inner_loop_b
    629 ; The 'loop_exit' clone.
    630 ;
    631 ; CHECK:       loop_begin.split.us:
    632 ; CHECK-NEXT:    br label %inner_loop_begin.us
    633 ;
    634 ; CHECK:       inner_loop_begin.us:
    635 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
    636 ; CHECK-NEXT:    %[[A:.*]] = load i32, i32* %a.ptr
    637 ; CHECK-NEXT:    br label %loop_exit.loopexit.split.us
    638 ;
    639 ; CHECK:       loop_exit.loopexit.split.us:
    640 ; CHECK-NEXT:    %[[A_LCSSA:.*]] = phi i32 [ %[[A]], %inner_loop_begin.us ]
    641 ; CHECK-NEXT:    br label %loop_exit
    642 
    643 inner_loop_b:
    644   %b = load i32, i32* %b.ptr
    645   br i1 %v, label %inner_loop_begin, label %loop_latch
    646 ; The 'inner_loop_b' unswitched loop.
    647 ;
    648 ; CHECK:       loop_begin.split:
    649 ; CHECK-NEXT:    br label %inner_loop_begin
    650 ;
    651 ; CHECK:       inner_loop_begin:
    652 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
    653 ; CHECK-NEXT:    %[[A:.*]] = load i32, i32* %a.ptr
    654 ; CHECK-NEXT:    br label %inner_loop_b
    655 ;
    656 ; CHECK:       inner_loop_b:
    657 ; CHECK-NEXT:    %[[B:.*]] = load i32, i32* %b.ptr
    658 ; CHECK-NEXT:    br i1 %[[V]], label %inner_loop_begin, label %loop_latch
    659 
    660 loop_latch:
    661   %b.phi = phi i32 [ %b, %inner_loop_b ]
    662   %v2 = load i1, i1* %ptr
    663   br i1 %v2, label %loop_begin, label %loop_exit
    664 ; CHECK:       loop_latch:
    665 ; CHECK-NEXT:    %[[B_INNER_LCSSA:.*]] = phi i32 [ %[[B]], %inner_loop_b ]
    666 ; CHECK-NEXT:    %[[V2:.*]] = load i1, i1* %ptr
    667 ; CHECK-NEXT:    br i1 %[[V2]], label %loop_begin, label %loop_exit.loopexit1
    668 
    669 loop_exit:
    670   %ab.phi = phi i32 [ %a, %inner_loop_begin ], [ %b.phi, %loop_latch ]
    671   ret i32 %ab.phi
    672 ; CHECK:       loop_exit.loopexit:
    673 ; CHECK-NEXT:    br label %loop_exit
    674 ;
    675 ; CHECK:       loop_exit.loopexit1:
    676 ; CHECK-NEXT:    %[[B_LCSSA:.*]] = phi i32 [ %[[B_INNER_LCSSA]], %loop_latch ]
    677 ; CHECK-NEXT:    br label %loop_exit
    678 ;
    679 ; CHECK:       loop_exit:
    680 ; CHECK-NEXT:    %[[AB_PHI:.*]] = phi i32 [ %[[A_LCSSA]], %loop_exit.loopexit ], [ %[[B_LCSSA]], %loop_exit.loopexit1 ]
    681 ; CHECK-NEXT:    ret i32 %[[AB_PHI]]
    682 }
    683 
    684 ; Test that we can unswitch a condition where we end up only cloning some of
    685 ; the nested loops and needing to delete some of the nested loops.
    686 define i32 @test6(i1* %ptr, i1 %cond1, i32* %a.ptr, i32* %b.ptr) {
    687 ; CHECK-LABEL: @test6(
    688 entry:
    689   br label %loop_begin
    690 ; CHECK-NEXT:  entry:
    691 ; CHECK-NEXT:    br i1 %cond1, label %entry.split.us, label %entry.split
    692 
    693 loop_begin:
    694   %v = load i1, i1* %ptr
    695   br i1 %cond1, label %loop_a, label %loop_b
    696 
    697 loop_a:
    698   br label %loop_a_inner
    699 
    700 loop_a_inner:
    701   %va = load i1, i1* %ptr
    702   %a = load i32, i32* %a.ptr
    703   br i1 %va, label %loop_a_inner, label %loop_a_inner_exit
    704 
    705 loop_a_inner_exit:
    706   %a.lcssa = phi i32 [ %a, %loop_a_inner ]
    707   br label %latch
    708 ; The 'loop_a' cloned loop.
    709 ;
    710 ; CHECK:       entry.split.us:
    711 ; CHECK-NEXT:    br label %loop_begin.us
    712 ;
    713 ; CHECK:       loop_begin.us:
    714 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
    715 ; CHECK-NEXT:    br label %loop_a.us
    716 ;
    717 ; CHECK:       loop_a.us:
    718 ; CHECK-NEXT:    br label %loop_a_inner.us
    719 ;
    720 ; CHECK:       loop_a_inner.us
    721 ; CHECK-NEXT:    %[[VA:.*]] = load i1, i1* %ptr
    722 ; CHECK-NEXT:    %[[A:.*]] = load i32, i32* %a.ptr
    723 ; CHECK-NEXT:    br i1 %[[VA]], label %loop_a_inner.us, label %loop_a_inner_exit.us
    724 ;
    725 ; CHECK:       loop_a_inner_exit.us:
    726 ; CHECK-NEXT:    %[[A_INNER_LCSSA:.*]] = phi i32 [ %[[A]], %loop_a_inner.us ]
    727 ; CHECK-NEXT:    br label %latch.us
    728 ;
    729 ; CHECK:       latch.us:
    730 ; CHECK-NEXT:    %[[A_PHI:.*]] = phi i32 [ %[[A_INNER_LCSSA]], %loop_a_inner_exit.us ]
    731 ; CHECK-NEXT:    br i1 %[[V]], label %loop_begin.us, label %loop_exit.split.us
    732 ;
    733 ; CHECK:       loop_exit.split.us:
    734 ; CHECK-NEXT:    %[[A_LCSSA:.*]] = phi i32 [ %[[A_PHI]], %latch.us ]
    735 ; CHECK-NEXT:    br label %loop_exit
    736 
    737 loop_b:
    738   br label %loop_b_inner
    739 
    740 loop_b_inner:
    741   %vb = load i1, i1* %ptr
    742   %b = load i32, i32* %b.ptr
    743   br i1 %vb, label %loop_b_inner, label %loop_b_inner_exit
    744 
    745 loop_b_inner_exit:
    746   %b.lcssa = phi i32 [ %b, %loop_b_inner ]
    747   br label %latch
    748 
    749 latch:
    750   %ab.phi = phi i32 [ %a.lcssa, %loop_a_inner_exit ], [ %b.lcssa, %loop_b_inner_exit ]
    751   br i1 %v, label %loop_begin, label %loop_exit
    752 ; The 'loop_b' unswitched loop.
    753 ;
    754 ; CHECK:       entry.split:
    755 ; CHECK-NEXT:    br label %loop_begin
    756 ;
    757 ; CHECK:       loop_begin:
    758 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
    759 ; CHECK-NEXT:    br label %loop_b
    760 ;
    761 ; CHECK:       loop_b:
    762 ; CHECK-NEXT:    br label %loop_b_inner
    763 ;
    764 ; CHECK:       loop_b_inner
    765 ; CHECK-NEXT:    %[[VB:.*]] = load i1, i1* %ptr
    766 ; CHECK-NEXT:    %[[B:.*]] = load i32, i32* %b.ptr
    767 ; CHECK-NEXT:    br i1 %[[VB]], label %loop_b_inner, label %loop_b_inner_exit
    768 ;
    769 ; CHECK:       loop_b_inner_exit:
    770 ; CHECK-NEXT:    %[[B_INNER_LCSSA:.*]] = phi i32 [ %[[B]], %loop_b_inner ]
    771 ; CHECK-NEXT:    br label %latch
    772 ;
    773 ; CHECK:       latch:
    774 ; CHECK-NEXT:    br i1 %[[V]], label %loop_begin, label %loop_exit.split
    775 ;
    776 ; CHECK:       loop_exit.split:
    777 ; CHECK-NEXT:    %[[B_LCSSA:.*]] = phi i32 [ %[[B_INNER_LCSSA]], %latch ]
    778 ; CHECK-NEXT:    br label %loop_exit
    779 
    780 loop_exit:
    781   %ab.lcssa = phi i32 [ %ab.phi, %latch ]
    782   ret i32 %ab.lcssa
    783 ; CHECK:       loop_exit:
    784 ; CHECK-NEXT:    %[[AB_PHI:.*]] = phi i32 [ %[[B_LCSSA]], %loop_exit.split ], [ %[[A_LCSSA]], %loop_exit.split.us ]
    785 ; CHECK-NEXT:    ret i32 %[[AB_PHI]]
    786 }
    787 
    788 ; Test that when unswitching a deeply nested loop condition in a way that
    789 ; produces a non-loop clone that can reach multiple exit blocks which are part
    790 ; of different outer loops we correctly divide the cloned loop blocks between
    791 ; the outer loops based on reachability.
    792 define i32 @test7a(i1* %ptr, i1* %cond.ptr, i32* %a.ptr, i32* %b.ptr) {
    793 ; CHECK-LABEL: @test7a(
    794 entry:
    795   br label %loop_begin
    796 ; CHECK-NEXT:  entry:
    797 ; CHECK-NEXT:    br label %loop_begin
    798 
    799 loop_begin:
    800   %a = load i32, i32* %a.ptr
    801   br label %inner_loop_begin
    802 ; CHECK:       loop_begin:
    803 ; CHECK-NEXT:    %[[A:.*]] = load i32, i32* %a.ptr
    804 ; CHECK-NEXT:    br label %inner_loop_begin
    805 
    806 inner_loop_begin:
    807   %a.phi = phi i32 [ %a, %loop_begin ], [ %a2, %inner_inner_loop_exit ]
    808   %cond = load i1, i1* %cond.ptr
    809   %b = load i32, i32* %b.ptr
    810   br label %inner_inner_loop_begin
    811 ; CHECK:       inner_loop_begin:
    812 ; CHECK-NEXT:    %[[A_INNER_PHI:.*]] = phi i32 [ %[[A]], %loop_begin ], [ %[[A2:.*]], %inner_inner_loop_exit ]
    813 ; CHECK-NEXT:    %[[COND:.*]] = load i1, i1* %cond.ptr
    814 ; CHECK-NEXT:    %[[B:.*]] = load i32, i32* %b.ptr
    815 ; CHECK-NEXT:    br i1 %[[COND]], label %inner_loop_begin.split.us, label %inner_loop_begin.split
    816 
    817 inner_inner_loop_begin:
    818   %v1 = load i1, i1* %ptr
    819   br i1 %v1, label %inner_inner_loop_a, label %inner_inner_loop_b
    820 
    821 inner_inner_loop_a:
    822   %v2 = load i1, i1* %ptr
    823   br i1 %v2, label %loop_exit, label %inner_inner_loop_c
    824 
    825 inner_inner_loop_b:
    826   %v3 = load i1, i1* %ptr
    827   br i1 %v3, label %inner_inner_loop_exit, label %inner_inner_loop_c
    828 
    829 inner_inner_loop_c:
    830   %v4 = load i1, i1* %ptr
    831   br i1 %v4, label %inner_loop_exit, label %inner_inner_loop_d
    832 
    833 inner_inner_loop_d:
    834   br i1 %cond, label %inner_loop_exit, label %inner_inner_loop_begin
    835 ; The cloned copy that always exits with the adjustments required to fix up
    836 ; loop exits.
    837 ;
    838 ; CHECK:       inner_loop_begin.split.us:
    839 ; CHECK-NEXT:    br label %inner_inner_loop_begin.us
    840 ;
    841 ; CHECK:       inner_inner_loop_begin.us:
    842 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
    843 ; CHECK-NEXT:    br i1 %[[V]], label %inner_inner_loop_a.us, label %inner_inner_loop_b.us
    844 ;
    845 ; CHECK:       inner_inner_loop_b.us:
    846 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
    847 ; CHECK-NEXT:    br i1 %[[V]], label %inner_inner_loop_exit.split.us, label %inner_inner_loop_c.us.loopexit
    848 ;
    849 ; CHECK:       inner_inner_loop_a.us:
    850 ; CHECK-NEXT:    %[[A_NEW_LCSSA:.*]] = phi i32 [ %[[A_INNER_PHI]], %inner_inner_loop_begin.us ]
    851 ; CHECK-NEXT:    %[[B_NEW_LCSSA:.*]] = phi i32 [ %[[B]], %inner_inner_loop_begin.us ]
    852 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
    853 ; CHECK-NEXT:    br i1 %[[V]], label %loop_exit.split.us, label %inner_inner_loop_c.us
    854 ;
    855 ; CHECK:       inner_inner_loop_c.us.loopexit:
    856 ; CHECK-NEXT:    br label %inner_inner_loop_c.us
    857 ;
    858 ; CHECK:       inner_inner_loop_c.us:
    859 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
    860 ; CHECK-NEXT:    br i1 %[[V]], label %inner_loop_exit.loopexit.split.us, label %inner_inner_loop_d.us
    861 ;
    862 ; CHECK:       inner_inner_loop_d.us:
    863 ; CHECK-NEXT:    br label %inner_loop_exit.loopexit.split
    864 ;
    865 ; CHECK:       inner_inner_loop_exit.split.us:
    866 ; CHECK-NEXT:    br label %inner_inner_loop_exit
    867 ;
    868 ; CHECK:       loop_exit.split.us:
    869 ; CHECK-NEXT:    %[[A_LCSSA_US:.*]] = phi i32 [ %[[A_NEW_LCSSA]], %inner_inner_loop_a.us ]
    870 ; CHECK-NEXT:    %[[B_LCSSA_US:.*]] = phi i32 [ %[[B_NEW_LCSSA]], %inner_inner_loop_a.us ]
    871 ; CHECK-NEXT:    br label %loop_exit
    872 ;
    873 ; CHECK:       inner_loop_exit.loopexit.split.us:
    874 ; CHECK-NEXT:    br label %inner_loop_exit.loopexit
    875 ;
    876 ; The original copy that continues to loop.
    877 ;
    878 ; CHECK:       inner_loop_begin.split:
    879 ; CHECK-NEXT:    br label %inner_inner_loop_begin
    880 ;
    881 ; CHECK:       inner_inner_loop_begin:
    882 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
    883 ; CHECK-NEXT:    br i1 %[[V]], label %inner_inner_loop_a, label %inner_inner_loop_b
    884 ;
    885 ; CHECK:       inner_inner_loop_a:
    886 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
    887 ; CHECK-NEXT:    br i1 %[[V]], label %loop_exit.split, label %inner_inner_loop_c
    888 ;
    889 ; CHECK:       inner_inner_loop_b:
    890 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
    891 ; CHECK-NEXT:    br i1 %[[V]], label %inner_inner_loop_exit.split, label %inner_inner_loop_c
    892 ;
    893 ; CHECK:       inner_inner_loop_c:
    894 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
    895 ; CHECK-NEXT:    br i1 %[[V]], label %inner_loop_exit.loopexit.split, label %inner_inner_loop_d
    896 ;
    897 ; CHECK:       inner_inner_loop_d:
    898 ; CHECK-NEXT:    br label %inner_inner_loop_begin
    899 ;
    900 ; CHECK:       inner_inner_loop_exit.split:
    901 ; CHECK-NEXT:    br label %inner_inner_loop_exit
    902 
    903 inner_inner_loop_exit:
    904   %a2 = load i32, i32* %a.ptr
    905   %v5 = load i1, i1* %ptr
    906   br i1 %v5, label %inner_loop_exit, label %inner_loop_begin
    907 ; CHECK:       inner_inner_loop_exit:
    908 ; CHECK-NEXT:    %[[A2]] = load i32, i32* %a.ptr
    909 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
    910 ; CHECK-NEXT:    br i1 %[[V]], label %inner_loop_exit.loopexit1, label %inner_loop_begin
    911 
    912 inner_loop_exit:
    913   br label %loop_begin
    914 ; CHECK:       inner_loop_exit.loopexit.split:
    915 ; CHECK-NEXT:    br label %inner_loop_exit.loopexit
    916 ;
    917 ; CHECK:       inner_loop_exit.loopexit:
    918 ; CHECK-NEXT:    br label %inner_loop_exit
    919 ;
    920 ; CHECK:       inner_loop_exit.loopexit1:
    921 ; CHECK-NEXT:    br label %inner_loop_exit
    922 ;
    923 ; CHECK:       inner_loop_exit:
    924 ; CHECK-NEXT:    br label %loop_begin
    925 
    926 loop_exit:
    927   %a.lcssa = phi i32 [ %a.phi, %inner_inner_loop_a ]
    928   %b.lcssa = phi i32 [ %b, %inner_inner_loop_a ]
    929   %result = add i32 %a.lcssa, %b.lcssa
    930   ret i32 %result
    931 ; CHECK:       loop_exit.split:
    932 ; CHECK-NEXT:    %[[A_LCSSA:.*]] = phi i32 [ %[[A_INNER_PHI]], %inner_inner_loop_a ]
    933 ; CHECK-NEXT:    %[[B_LCSSA:.*]] = phi i32 [ %[[B]], %inner_inner_loop_a ]
    934 ; CHECK-NEXT:    br label %loop_exit
    935 ;
    936 ; CHECK:       loop_exit:
    937 ; CHECK-NEXT:    %[[A_PHI:.*]] = phi i32 [ %[[A_LCSSA]], %loop_exit.split ], [ %[[A_LCSSA_US]], %loop_exit.split.us ]
    938 ; CHECK-NEXT:    %[[B_PHI:.*]] = phi i32 [ %[[B_LCSSA]], %loop_exit.split ], [ %[[B_LCSSA_US]], %loop_exit.split.us ]
    939 ; CHECK-NEXT:    %[[RESULT:.*]] = add i32 %[[A_PHI]], %[[B_PHI]]
    940 ; CHECK-NEXT:    ret i32 %[[RESULT]]
    941 }
    942 
    943 ; Same pattern as @test7a but here the original loop becomes a non-loop that
    944 ; can reach multiple exit blocks which are part of different outer loops.
    945 define i32 @test7b(i1* %ptr, i1* %cond.ptr, i32* %a.ptr, i32* %b.ptr) {
    946 ; CHECK-LABEL: @test7b(
    947 entry:
    948   br label %loop_begin
    949 ; CHECK-NEXT:  entry:
    950 ; CHECK-NEXT:    br label %loop_begin
    951 
    952 loop_begin:
    953   %a = load i32, i32* %a.ptr
    954   br label %inner_loop_begin
    955 ; CHECK:       loop_begin:
    956 ; CHECK-NEXT:    %[[A:.*]] = load i32, i32* %a.ptr
    957 ; CHECK-NEXT:    br label %inner_loop_begin
    958 
    959 inner_loop_begin:
    960   %a.phi = phi i32 [ %a, %loop_begin ], [ %a2, %inner_inner_loop_exit ]
    961   %cond = load i1, i1* %cond.ptr
    962   %b = load i32, i32* %b.ptr
    963   br label %inner_inner_loop_begin
    964 ; CHECK:       inner_loop_begin:
    965 ; CHECK-NEXT:    %[[A_INNER_PHI:.*]] = phi i32 [ %[[A]], %loop_begin ], [ %[[A2:.*]], %inner_inner_loop_exit ]
    966 ; CHECK-NEXT:    %[[COND:.*]] = load i1, i1* %cond.ptr
    967 ; CHECK-NEXT:    %[[B:.*]] = load i32, i32* %b.ptr
    968 ; CHECK-NEXT:    br i1 %[[COND]], label %inner_loop_begin.split.us, label %inner_loop_begin.split
    969 
    970 inner_inner_loop_begin:
    971   %v1 = load i1, i1* %ptr
    972   br i1 %v1, label %inner_inner_loop_a, label %inner_inner_loop_b
    973 
    974 inner_inner_loop_a:
    975   %v2 = load i1, i1* %ptr
    976   br i1 %v2, label %loop_exit, label %inner_inner_loop_c
    977 
    978 inner_inner_loop_b:
    979   %v3 = load i1, i1* %ptr
    980   br i1 %v3, label %inner_inner_loop_exit, label %inner_inner_loop_c
    981 
    982 inner_inner_loop_c:
    983   %v4 = load i1, i1* %ptr
    984   br i1 %v4, label %inner_loop_exit, label %inner_inner_loop_d
    985 
    986 inner_inner_loop_d:
    987   br i1 %cond, label %inner_inner_loop_begin, label %inner_loop_exit
    988 ; The cloned copy that continues looping.
    989 ;
    990 ; CHECK:       inner_loop_begin.split.us:
    991 ; CHECK-NEXT:    br label %inner_inner_loop_begin.us
    992 ;
    993 ; CHECK:       inner_inner_loop_begin.us:
    994 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
    995 ; CHECK-NEXT:    br i1 %[[V]], label %inner_inner_loop_a.us, label %inner_inner_loop_b.us
    996 ;
    997 ; CHECK:       inner_inner_loop_b.us:
    998 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
    999 ; CHECK-NEXT:    br i1 %[[V]], label %inner_inner_loop_exit.split.us, label %inner_inner_loop_c.us
   1000 ;
   1001 ; CHECK:       inner_inner_loop_a.us:
   1002 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
   1003 ; CHECK-NEXT:    br i1 %[[V]], label %loop_exit.split.us, label %inner_inner_loop_c.us
   1004 ;
   1005 ; CHECK:       inner_inner_loop_c.us:
   1006 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
   1007 ; CHECK-NEXT:    br i1 %[[V]], label %inner_loop_exit.loopexit.split.us, label %inner_inner_loop_d.us
   1008 ;
   1009 ; CHECK:       inner_inner_loop_d.us:
   1010 ; CHECK-NEXT:    br label %inner_inner_loop_begin.us
   1011 ;
   1012 ; CHECK:       inner_inner_loop_exit.split.us:
   1013 ; CHECK-NEXT:    br label %inner_inner_loop_exit
   1014 ;
   1015 ; CHECK:       loop_exit.split.us:
   1016 ; CHECK-NEXT:    %[[A_LCSSA_US:.*]] = phi i32 [ %[[A_INNER_PHI]], %inner_inner_loop_a.us ]
   1017 ; CHECK-NEXT:    %[[B_LCSSA_US:.*]] = phi i32 [ %[[B]], %inner_inner_loop_a.us ]
   1018 ; CHECK-NEXT:    br label %loop_exit
   1019 ;
   1020 ; CHECK:       inner_loop_exit.loopexit.split.us:
   1021 ; CHECK-NEXT:    br label %inner_loop_exit.loopexit
   1022 ;
   1023 ; The original copy that now always exits and needs adjustments for exit
   1024 ; blocks.
   1025 ;
   1026 ; CHECK:       inner_loop_begin.split:
   1027 ; CHECK-NEXT:    br label %inner_inner_loop_begin
   1028 ;
   1029 ; CHECK:       inner_inner_loop_begin:
   1030 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
   1031 ; CHECK-NEXT:    br i1 %[[V]], label %inner_inner_loop_a, label %inner_inner_loop_b
   1032 ;
   1033 ; CHECK:       inner_inner_loop_a:
   1034 ; CHECK-NEXT:    %[[A_NEW_LCSSA:.*]] = phi i32 [ %[[A_INNER_PHI]], %inner_inner_loop_begin ]
   1035 ; CHECK-NEXT:    %[[B_NEW_LCSSA:.*]] = phi i32 [ %[[B]], %inner_inner_loop_begin ]
   1036 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
   1037 ; CHECK-NEXT:    br i1 %[[V]], label %loop_exit.split, label %inner_inner_loop_c
   1038 ;
   1039 ; CHECK:       inner_inner_loop_b:
   1040 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
   1041 ; CHECK-NEXT:    br i1 %[[V]], label %inner_inner_loop_exit.split, label %inner_inner_loop_c.loopexit
   1042 ;
   1043 ; CHECK:       inner_inner_loop_c.loopexit:
   1044 ; CHECK-NEXT:    br label %inner_inner_loop_c
   1045 ;
   1046 ; CHECK:       inner_inner_loop_c:
   1047 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
   1048 ; CHECK-NEXT:    br i1 %[[V]], label %inner_loop_exit.loopexit.split, label %inner_inner_loop_d
   1049 ;
   1050 ; CHECK:       inner_inner_loop_d:
   1051 ; CHECK-NEXT:    br label %inner_loop_exit.loopexit.split
   1052 ;
   1053 ; CHECK:       inner_inner_loop_exit.split:
   1054 ; CHECK-NEXT:    br label %inner_inner_loop_exit
   1055 
   1056 inner_inner_loop_exit:
   1057   %a2 = load i32, i32* %a.ptr
   1058   %v5 = load i1, i1* %ptr
   1059   br i1 %v5, label %inner_loop_exit, label %inner_loop_begin
   1060 ; CHECK:       inner_inner_loop_exit:
   1061 ; CHECK-NEXT:    %[[A2]] = load i32, i32* %a.ptr
   1062 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
   1063 ; CHECK-NEXT:    br i1 %[[V]], label %inner_loop_exit.loopexit1, label %inner_loop_begin
   1064 
   1065 inner_loop_exit:
   1066   br label %loop_begin
   1067 ; CHECK:       inner_loop_exit.loopexit.split:
   1068 ; CHECK-NEXT:    br label %inner_loop_exit.loopexit
   1069 ;
   1070 ; CHECK:       inner_loop_exit.loopexit:
   1071 ; CHECK-NEXT:    br label %inner_loop_exit
   1072 ;
   1073 ; CHECK:       inner_loop_exit.loopexit1:
   1074 ; CHECK-NEXT:    br label %inner_loop_exit
   1075 ;
   1076 ; CHECK:       inner_loop_exit:
   1077 ; CHECK-NEXT:    br label %loop_begin
   1078 
   1079 loop_exit:
   1080   %a.lcssa = phi i32 [ %a.phi, %inner_inner_loop_a ]
   1081   %b.lcssa = phi i32 [ %b, %inner_inner_loop_a ]
   1082   %result = add i32 %a.lcssa, %b.lcssa
   1083   ret i32 %result
   1084 ; CHECK:       loop_exit.split:
   1085 ; CHECK-NEXT:    %[[A_LCSSA:.*]] = phi i32 [ %[[A_NEW_LCSSA]], %inner_inner_loop_a ]
   1086 ; CHECK-NEXT:    %[[B_LCSSA:.*]] = phi i32 [ %[[B_NEW_LCSSA]], %inner_inner_loop_a ]
   1087 ; CHECK-NEXT:    br label %loop_exit
   1088 ;
   1089 ; CHECK:       loop_exit:
   1090 ; CHECK-NEXT:    %[[A_PHI:.*]] = phi i32 [ %[[A_LCSSA]], %loop_exit.split ], [ %[[A_LCSSA_US]], %loop_exit.split.us ]
   1091 ; CHECK-NEXT:    %[[B_PHI:.*]] = phi i32 [ %[[B_LCSSA]], %loop_exit.split ], [ %[[B_LCSSA_US]], %loop_exit.split.us ]
   1092 ; CHECK-NEXT:    %[[RESULT:.*]] = add i32 %[[A_PHI]], %[[B_PHI]]
   1093 ; CHECK-NEXT:    ret i32 %[[RESULT]]
   1094 }
   1095 
   1096 ; Test that when the exit block set of an inner loop changes to start at a less
   1097 ; high level of the loop nest we correctly hoist the loop up the nest.
   1098 define i32 @test8a(i1* %ptr, i1* %cond.ptr, i32* %a.ptr, i32* %b.ptr) {
   1099 ; CHECK-LABEL: @test8a(
   1100 entry:
   1101   br label %loop_begin
   1102 ; CHECK-NEXT:  entry:
   1103 ; CHECK-NEXT:    br label %loop_begin
   1104 
   1105 loop_begin:
   1106   %a = load i32, i32* %a.ptr
   1107   br label %inner_loop_begin
   1108 ; CHECK:       loop_begin:
   1109 ; CHECK-NEXT:    %[[A:.*]] = load i32, i32* %a.ptr
   1110 ; CHECK-NEXT:    br label %inner_loop_begin
   1111 
   1112 inner_loop_begin:
   1113   %a.phi = phi i32 [ %a, %loop_begin ], [ %a2, %inner_inner_loop_exit ]
   1114   %cond = load i1, i1* %cond.ptr
   1115   %b = load i32, i32* %b.ptr
   1116   br label %inner_inner_loop_begin
   1117 ; CHECK:       inner_loop_begin:
   1118 ; CHECK-NEXT:    %[[A_INNER_PHI:.*]] = phi i32 [ %[[A]], %loop_begin ], [ %[[A2:.*]], %inner_inner_loop_exit ]
   1119 ; CHECK-NEXT:    %[[COND:.*]] = load i1, i1* %cond.ptr
   1120 ; CHECK-NEXT:    %[[B:.*]] = load i32, i32* %b.ptr
   1121 ; CHECK-NEXT:    br i1 %[[COND]], label %inner_loop_begin.split.us, label %inner_loop_begin.split
   1122 
   1123 inner_inner_loop_begin:
   1124   %v1 = load i1, i1* %ptr
   1125   br i1 %v1, label %inner_inner_loop_a, label %inner_inner_loop_b
   1126 
   1127 inner_inner_loop_a:
   1128   %v2 = load i1, i1* %ptr
   1129   br i1 %v2, label %inner_inner_loop_latch, label %inner_loop_exit
   1130 
   1131 inner_inner_loop_b:
   1132   br i1 %cond, label %inner_inner_loop_latch, label %inner_inner_loop_exit
   1133 
   1134 inner_inner_loop_latch:
   1135   br label %inner_inner_loop_begin
   1136 ; The cloned region is now an exit from the inner loop.
   1137 ;
   1138 ; CHECK:       inner_loop_begin.split.us:
   1139 ; CHECK-NEXT:    %[[A_INNER_INNER_LCSSA:.*]] = phi i32 [ %[[A_INNER_PHI]], %inner_loop_begin ]
   1140 ; CHECK-NEXT:    br label %inner_inner_loop_begin.us
   1141 ;
   1142 ; CHECK:       inner_inner_loop_begin.us:
   1143 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
   1144 ; CHECK-NEXT:    br i1 %[[V]], label %inner_inner_loop_a.us, label %inner_inner_loop_b.us
   1145 ;
   1146 ; CHECK:       inner_inner_loop_b.us:
   1147 ; CHECK-NEXT:    br label %inner_inner_loop_latch.us
   1148 ;
   1149 ; CHECK:       inner_inner_loop_a.us:
   1150 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
   1151 ; CHECK-NEXT:    br i1 %[[V]], label %inner_inner_loop_latch.us, label %inner_loop_exit.loopexit.split.us
   1152 ;
   1153 ; CHECK:       inner_inner_loop_latch.us:
   1154 ; CHECK-NEXT:    br label %inner_inner_loop_begin.us
   1155 ;
   1156 ; CHECK:       inner_loop_exit.loopexit.split.us:
   1157 ; CHECK-NEXT:    %[[A_INNER_LCSSA_US:.*]] = phi i32 [ %[[A_INNER_INNER_LCSSA]], %inner_inner_loop_a.us ]
   1158 ; CHECK-NEXT:    br label %inner_loop_exit.loopexit
   1159 ;
   1160 ; The original region exits the loop earlier.
   1161 ;
   1162 ; CHECK:       inner_loop_begin.split:
   1163 ; CHECK-NEXT:    br label %inner_inner_loop_begin
   1164 ;
   1165 ; CHECK:       inner_inner_loop_begin:
   1166 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
   1167 ; CHECK-NEXT:    br i1 %[[V]], label %inner_inner_loop_a, label %inner_inner_loop_b
   1168 ;
   1169 ; CHECK:       inner_inner_loop_a:
   1170 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
   1171 ; CHECK-NEXT:    br i1 %[[V]], label %inner_inner_loop_latch, label %inner_loop_exit.loopexit.split
   1172 ;
   1173 ; CHECK:       inner_inner_loop_b:
   1174 ; CHECK-NEXT:    br label %inner_inner_loop_exit
   1175 ;
   1176 ; CHECK:       inner_inner_loop_latch:
   1177 ; CHECK-NEXT:    br label %inner_inner_loop_begin
   1178 
   1179 inner_inner_loop_exit:
   1180   %a2 = load i32, i32* %a.ptr
   1181   %v4 = load i1, i1* %ptr
   1182   br i1 %v4, label %inner_loop_exit, label %inner_loop_begin
   1183 ; CHECK:       inner_inner_loop_exit:
   1184 ; CHECK-NEXT:    %[[A2]] = load i32, i32* %a.ptr
   1185 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
   1186 ; CHECK-NEXT:    br i1 %[[V]], label %inner_loop_exit.loopexit1, label %inner_loop_begin
   1187 
   1188 inner_loop_exit:
   1189   %v5 = load i1, i1* %ptr
   1190   br i1 %v5, label %loop_exit, label %loop_begin
   1191 ; CHECK:       inner_loop_exit.loopexit.split:
   1192 ; CHECK-NEXT:    %[[A_INNER_LCSSA:.*]] = phi i32 [ %[[A_INNER_PHI]], %inner_inner_loop_a ]
   1193 ; CHECK-NEXT:    br label %inner_loop_exit.loopexit
   1194 ;
   1195 ; CHECK:       inner_loop_exit.loopexit:
   1196 ; CHECK-NEXT:    %[[A_INNER_US_PHI:.*]] = phi i32 [ %[[A_INNER_LCSSA]], %inner_loop_exit.loopexit.split ], [ %[[A_INNER_LCSSA_US]], %inner_loop_exit.loopexit.split.us ]
   1197 ; CHECK-NEXT:    br label %inner_loop_exit
   1198 ;
   1199 ; CHECK:       inner_loop_exit.loopexit1:
   1200 ; CHECK-NEXT:    %[[A_INNER_LCSSA2:.*]] = phi i32 [ %[[A_INNER_PHI]], %inner_inner_loop_exit ]
   1201 ; CHECK-NEXT:    br label %inner_loop_exit
   1202 ;
   1203 ; CHECK:       inner_loop_exit:
   1204 ; CHECK-NEXT:    %[[A_INNER_PHI:.*]] = phi i32 [ %[[A_INNER_LCSSA2]], %inner_loop_exit.loopexit1 ], [ %[[A_INNER_US_PHI]], %inner_loop_exit.loopexit ]
   1205 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
   1206 ; CHECK-NEXT:    br i1 %[[V]], label %loop_exit, label %loop_begin
   1207 
   1208 loop_exit:
   1209   %a.lcssa = phi i32 [ %a.phi, %inner_loop_exit ]
   1210   ret i32 %a.lcssa
   1211 ; CHECK:       loop_exit:
   1212 ; CHECK-NEXT:    %[[A_LCSSA:.*]] = phi i32 [ %[[A_INNER_PHI]], %inner_loop_exit ]
   1213 ; CHECK-NEXT:    ret i32 %[[A_LCSSA]]
   1214 }
   1215 
   1216 ; Same pattern as @test8a but where the original loop looses an exit block and
   1217 ; needs to be hoisted up the nest.
   1218 define i32 @test8b(i1* %ptr, i1* %cond.ptr, i32* %a.ptr, i32* %b.ptr) {
   1219 ; CHECK-LABEL: @test8b(
   1220 entry:
   1221   br label %loop_begin
   1222 ; CHECK-NEXT:  entry:
   1223 ; CHECK-NEXT:    br label %loop_begin
   1224 
   1225 loop_begin:
   1226   %a = load i32, i32* %a.ptr
   1227   br label %inner_loop_begin
   1228 ; CHECK:       loop_begin:
   1229 ; CHECK-NEXT:    %[[A:.*]] = load i32, i32* %a.ptr
   1230 ; CHECK-NEXT:    br label %inner_loop_begin
   1231 
   1232 inner_loop_begin:
   1233   %a.phi = phi i32 [ %a, %loop_begin ], [ %a2, %inner_inner_loop_exit ]
   1234   %cond = load i1, i1* %cond.ptr
   1235   %b = load i32, i32* %b.ptr
   1236   br label %inner_inner_loop_begin
   1237 ; CHECK:       inner_loop_begin:
   1238 ; CHECK-NEXT:    %[[A_INNER_PHI:.*]] = phi i32 [ %[[A]], %loop_begin ], [ %[[A2:.*]], %inner_inner_loop_exit ]
   1239 ; CHECK-NEXT:    %[[COND:.*]] = load i1, i1* %cond.ptr
   1240 ; CHECK-NEXT:    %[[B:.*]] = load i32, i32* %b.ptr
   1241 ; CHECK-NEXT:    br i1 %[[COND]], label %inner_loop_begin.split.us, label %inner_loop_begin.split
   1242 
   1243 inner_inner_loop_begin:
   1244   %v1 = load i1, i1* %ptr
   1245   br i1 %v1, label %inner_inner_loop_a, label %inner_inner_loop_b
   1246 
   1247 inner_inner_loop_a:
   1248   %v2 = load i1, i1* %ptr
   1249   br i1 %v2, label %inner_inner_loop_latch, label %inner_loop_exit
   1250 
   1251 inner_inner_loop_b:
   1252   br i1 %cond, label %inner_inner_loop_exit, label %inner_inner_loop_latch
   1253 
   1254 inner_inner_loop_latch:
   1255   br label %inner_inner_loop_begin
   1256 ; The cloned region is similar to before but with one earlier exit.
   1257 ;
   1258 ; CHECK:       inner_loop_begin.split.us:
   1259 ; CHECK-NEXT:    br label %inner_inner_loop_begin.us
   1260 ;
   1261 ; CHECK:       inner_inner_loop_begin.us:
   1262 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
   1263 ; CHECK-NEXT:    br i1 %[[V]], label %inner_inner_loop_a.us, label %inner_inner_loop_b.us
   1264 ;
   1265 ; CHECK:       inner_inner_loop_b.us:
   1266 ; CHECK-NEXT:    br label %inner_inner_loop_exit.split.us
   1267 ;
   1268 ; CHECK:       inner_inner_loop_a.us:
   1269 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
   1270 ; CHECK-NEXT:    br i1 %[[V]], label %inner_inner_loop_latch.us, label %inner_loop_exit.loopexit.split.us
   1271 ;
   1272 ; CHECK:       inner_inner_loop_latch.us:
   1273 ; CHECK-NEXT:    br label %inner_inner_loop_begin.us
   1274 ;
   1275 ; CHECK:       inner_inner_loop_exit.split.us:
   1276 ; CHECK-NEXT:    br label %inner_inner_loop_exit
   1277 ;
   1278 ; CHECK:       inner_loop_exit.loopexit.split.us:
   1279 ; CHECK-NEXT:    %[[A_INNER_LCSSA_US:.*]] = phi i32 [ %[[A_INNER_PHI]], %inner_inner_loop_a.us ]
   1280 ; CHECK-NEXT:    br label %inner_loop_exit.loopexit
   1281 ;
   1282 ; The original region is now an exit in the preheader.
   1283 ;
   1284 ; CHECK:       inner_loop_begin.split:
   1285 ; CHECK-NEXT:    %[[A_INNER_INNER_LCSSA:.*]] = phi i32 [ %[[A_INNER_PHI]], %inner_loop_begin ]
   1286 ; CHECK-NEXT:    br label %inner_inner_loop_begin
   1287 ;
   1288 ; CHECK:       inner_inner_loop_begin:
   1289 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
   1290 ; CHECK-NEXT:    br i1 %[[V]], label %inner_inner_loop_a, label %inner_inner_loop_b
   1291 ;
   1292 ; CHECK:       inner_inner_loop_a:
   1293 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
   1294 ; CHECK-NEXT:    br i1 %[[V]], label %inner_inner_loop_latch, label %inner_loop_exit.loopexit.split
   1295 ;
   1296 ; CHECK:       inner_inner_loop_b:
   1297 ; CHECK-NEXT:    br label %inner_inner_loop_latch
   1298 ;
   1299 ; CHECK:       inner_inner_loop_latch:
   1300 ; CHECK-NEXT:    br label %inner_inner_loop_begin
   1301 
   1302 inner_inner_loop_exit:
   1303   %a2 = load i32, i32* %a.ptr
   1304   %v4 = load i1, i1* %ptr
   1305   br i1 %v4, label %inner_loop_exit, label %inner_loop_begin
   1306 ; CHECK:       inner_inner_loop_exit:
   1307 ; CHECK-NEXT:    %[[A2]] = load i32, i32* %a.ptr
   1308 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
   1309 ; CHECK-NEXT:    br i1 %[[V]], label %inner_loop_exit.loopexit1, label %inner_loop_begin
   1310 
   1311 inner_loop_exit:
   1312   %v5 = load i1, i1* %ptr
   1313   br i1 %v5, label %loop_exit, label %loop_begin
   1314 ; CHECK:       inner_loop_exit.loopexit.split:
   1315 ; CHECK-NEXT:    %[[A_INNER_LCSSA:.*]] = phi i32 [ %[[A_INNER_INNER_LCSSA]], %inner_inner_loop_a ]
   1316 ; CHECK-NEXT:    br label %inner_loop_exit.loopexit
   1317 ;
   1318 ; CHECK:       inner_loop_exit.loopexit:
   1319 ; CHECK-NEXT:    %[[A_INNER_US_PHI:.*]] = phi i32 [ %[[A_INNER_LCSSA]], %inner_loop_exit.loopexit.split ], [ %[[A_INNER_LCSSA_US]], %inner_loop_exit.loopexit.split.us ]
   1320 ; CHECK-NEXT:    br label %inner_loop_exit
   1321 ;
   1322 ; CHECK:       inner_loop_exit.loopexit1:
   1323 ; CHECK-NEXT:    %[[A_INNER_LCSSA2:.*]] = phi i32 [ %[[A_INNER_PHI]], %inner_inner_loop_exit ]
   1324 ; CHECK-NEXT:    br label %inner_loop_exit
   1325 ;
   1326 ; CHECK:       inner_loop_exit:
   1327 ; CHECK-NEXT:    %[[A_INNER_PHI:.*]] = phi i32 [ %[[A_INNER_LCSSA2]], %inner_loop_exit.loopexit1 ], [ %[[A_INNER_US_PHI]], %inner_loop_exit.loopexit ]
   1328 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
   1329 ; CHECK-NEXT:    br i1 %[[V]], label %loop_exit, label %loop_begin
   1330 
   1331 loop_exit:
   1332   %a.lcssa = phi i32 [ %a.phi, %inner_loop_exit ]
   1333   ret i32 %a.lcssa
   1334 ; CHECK:       loop_exit:
   1335 ; CHECK-NEXT:    %[[A_LCSSA:.*]] = phi i32 [ %[[A_INNER_PHI]], %inner_loop_exit ]
   1336 ; CHECK-NEXT:    ret i32 %[[A_LCSSA]]
   1337 }
   1338 
   1339 ; Test for when unswitching produces a clone of an inner loop but
   1340 ; the clone no longer has an exiting edge *at all* and loops infinitely.
   1341 ; Because it doesn't ever exit to the outer loop it is no longer an inner loop
   1342 ; but needs to be hoisted up the nest to be a top-level loop.
   1343 define i32 @test9a(i1* %ptr, i1* %cond.ptr, i32* %a.ptr, i32* %b.ptr) {
   1344 ; CHECK-LABEL: @test9a(
   1345 entry:
   1346   br label %loop_begin
   1347 ; CHECK-NEXT:  entry:
   1348 ; CHECK-NEXT:    br label %loop_begin
   1349 
   1350 loop_begin:
   1351   %b = load i32, i32* %b.ptr
   1352   %cond = load i1, i1* %cond.ptr
   1353   br label %inner_loop_begin
   1354 ; CHECK:       loop_begin:
   1355 ; CHECK-NEXT:    %[[B:.*]] = load i32, i32* %b.ptr
   1356 ; CHECK-NEXT:    %[[COND:.*]] = load i1, i1* %cond.ptr
   1357 ; CHECK-NEXT:    br i1 %[[COND]], label %loop_begin.split.us, label %loop_begin.split
   1358 
   1359 inner_loop_begin:
   1360   %a = load i32, i32* %a.ptr
   1361   br i1 %cond, label %inner_loop_latch, label %inner_loop_exit
   1362 
   1363 inner_loop_latch:
   1364   call void @sink1(i32 %b)
   1365   br label %inner_loop_begin
   1366 ; The cloned inner loop ends up as an infinite loop and thus being a top-level
   1367 ; loop with the preheader as an exit block of the outer loop.
   1368 ;
   1369 ; CHECK:       loop_begin.split.us
   1370 ; CHECK-NEXT:    %[[B_LCSSA:.*]] = phi i32 [ %[[B]], %loop_begin ]
   1371 ; CHECK-NEXT:    br label %inner_loop_begin.us
   1372 ;
   1373 ; CHECK:       inner_loop_begin.us:
   1374 ; CHECK-NEXT:    %[[A:.*]] = load i32, i32* %a.ptr
   1375 ; CHECK-NEXT:    br label %inner_loop_latch.us
   1376 ;
   1377 ; CHECK:       inner_loop_latch.us:
   1378 ; CHECK-NEXT:    call void @sink1(i32 %[[B_LCSSA]])
   1379 ; CHECK-NEXT:    br label %inner_loop_begin.us
   1380 ;
   1381 ; The original loop becomes boring non-loop code.
   1382 ;
   1383 ; CHECK:       loop_begin.split
   1384 ; CHECK-NEXT:    br label %inner_loop_begin
   1385 ;
   1386 ; CHECK:       inner_loop_begin:
   1387 ; CHECK-NEXT:    %[[A:.*]] = load i32, i32* %a.ptr
   1388 ; CHECK-NEXT:    br label %inner_loop_exit
   1389 
   1390 inner_loop_exit:
   1391   %a.inner_lcssa = phi i32 [ %a, %inner_loop_begin ]
   1392   %v = load i1, i1* %ptr
   1393   br i1 %v, label %loop_begin, label %loop_exit
   1394 ; CHECK:       inner_loop_exit:
   1395 ; CHECK-NEXT:    %[[A_INNER_LCSSA:.*]] = phi i32 [ %[[A]], %inner_loop_begin ]
   1396 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
   1397 ; CHECK-NEXT:    br i1 %[[V]], label %loop_begin, label %loop_exit
   1398 
   1399 loop_exit:
   1400   %a.lcssa = phi i32 [ %a.inner_lcssa, %inner_loop_exit ]
   1401   ret i32 %a.lcssa
   1402 ; CHECK:       loop_exit:
   1403 ; CHECK-NEXT:    %[[A_LCSSA:.*]] = phi i32 [ %[[A_INNER_LCSSA]], %inner_loop_exit ]
   1404 ; CHECK-NEXT:    ret i32 %[[A_LCSSA]]
   1405 }
   1406 
   1407 ; The same core pattern as @test9a, but instead of the cloned loop becoming an
   1408 ; infinite loop, the original loop has its only exit unswitched and the
   1409 ; original loop becomes infinite and must be hoisted out of the loop nest.
   1410 define i32 @test9b(i1* %ptr, i1* %cond.ptr, i32* %a.ptr, i32* %b.ptr) {
   1411 ; CHECK-LABEL: @test9b(
   1412 entry:
   1413   br label %loop_begin
   1414 ; CHECK-NEXT:  entry:
   1415 ; CHECK-NEXT:    br label %loop_begin
   1416 
   1417 loop_begin:
   1418   %b = load i32, i32* %b.ptr
   1419   %cond = load i1, i1* %cond.ptr
   1420   br label %inner_loop_begin
   1421 ; CHECK:       loop_begin:
   1422 ; CHECK-NEXT:    %[[B:.*]] = load i32, i32* %b.ptr
   1423 ; CHECK-NEXT:    %[[COND:.*]] = load i1, i1* %cond.ptr
   1424 ; CHECK-NEXT:    br i1 %[[COND]], label %loop_begin.split.us, label %loop_begin.split
   1425 
   1426 inner_loop_begin:
   1427   %a = load i32, i32* %a.ptr
   1428   br i1 %cond, label %inner_loop_exit, label %inner_loop_latch
   1429 
   1430 inner_loop_latch:
   1431   call void @sink1(i32 %b)
   1432   br label %inner_loop_begin
   1433 ; The cloned inner loop becomes a boring non-loop.
   1434 ;
   1435 ; CHECK:       loop_begin.split.us
   1436 ; CHECK-NEXT:    br label %inner_loop_begin.us
   1437 ;
   1438 ; CHECK:       inner_loop_begin.us:
   1439 ; CHECK-NEXT:    %[[A:.*]] = load i32, i32* %a.ptr
   1440 ; CHECK-NEXT:    br label %inner_loop_exit.split.us
   1441 ;
   1442 ; CHECK:       inner_loop_exit.split.us
   1443 ; CHECK-NEXT:    %[[A_INNER_LCSSA_US:.*]] = phi i32 [ %[[A]], %inner_loop_begin.us ]
   1444 ; CHECK-NEXT:    br label %inner_loop_exit
   1445 ;
   1446 ; The original loop becomes an infinite loop and thus a top-level loop with the
   1447 ; preheader as an exit block for the outer loop.
   1448 ;
   1449 ; CHECK:       loop_begin.split
   1450 ; CHECK-NEXT:    %[[B_LCSSA:.*]] = phi i32 [ %[[B]], %loop_begin ]
   1451 ; CHECK-NEXT:    br label %inner_loop_begin
   1452 ;
   1453 ; CHECK:       inner_loop_begin:
   1454 ; CHECK-NEXT:    %[[A:.*]] = load i32, i32* %a.ptr
   1455 ; CHECK-NEXT:    br label %inner_loop_latch
   1456 ;
   1457 ; CHECK:       inner_loop_latch:
   1458 ; CHECK-NEXT:    call void @sink1(i32 %[[B_LCSSA]])
   1459 ; CHECK-NEXT:    br label %inner_loop_begin
   1460 
   1461 inner_loop_exit:
   1462   %a.inner_lcssa = phi i32 [ %a, %inner_loop_begin ]
   1463   %v = load i1, i1* %ptr
   1464   br i1 %v, label %loop_begin, label %loop_exit
   1465 ; CHECK:       inner_loop_exit:
   1466 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
   1467 ; CHECK-NEXT:    br i1 %[[V]], label %loop_begin, label %loop_exit
   1468 
   1469 loop_exit:
   1470   %a.lcssa = phi i32 [ %a.inner_lcssa, %inner_loop_exit ]
   1471   ret i32 %a.lcssa
   1472 ; CHECK:       loop_exit:
   1473 ; CHECK-NEXT:    %[[A_LCSSA:.*]] = phi i32 [ %[[A_INNER_LCSSA_US]], %inner_loop_exit ]
   1474 ; CHECK-NEXT:    ret i32 %[[A_LCSSA]]
   1475 }
   1476 
   1477 ; Test that requires re-forming dedicated exits for the cloned loop.
   1478 define i32 @test10a(i1* %ptr, i1 %cond, i32* %a.ptr) {
   1479 ; CHECK-LABEL: @test10a(
   1480 entry:
   1481   br label %loop_begin
   1482 ; CHECK-NEXT:  entry:
   1483 ; CHECK-NEXT:    br i1 %cond, label %entry.split.us, label %entry.split
   1484 
   1485 loop_begin:
   1486   %a = load i32, i32* %a.ptr
   1487   %v1 = load i1, i1* %ptr
   1488   br i1 %v1, label %loop_a, label %loop_b
   1489 
   1490 loop_a:
   1491   %v2 = load i1, i1* %ptr
   1492   br i1 %v2, label %loop_exit, label %loop_begin
   1493 
   1494 loop_b:
   1495   br i1 %cond, label %loop_exit, label %loop_begin
   1496 ; The cloned loop with one edge as a direct exit.
   1497 ;
   1498 ; CHECK:       entry.split.us:
   1499 ; CHECK-NEXT:    br label %loop_begin.us
   1500 ;
   1501 ; CHECK:       loop_begin.us:
   1502 ; CHECK-NEXT:    %[[A:.*]] = load i32, i32* %a.ptr
   1503 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
   1504 ; CHECK-NEXT:    br i1 %[[V]], label %loop_a.us, label %loop_b.us
   1505 ;
   1506 ; CHECK:       loop_b.us:
   1507 ; CHECK-NEXT:    %[[A_LCSSA_B:.*]] = phi i32 [ %[[A]], %loop_begin.us ]
   1508 ; CHECK-NEXT:    br label %loop_exit.split.us
   1509 ;
   1510 ; CHECK:       loop_a.us:
   1511 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
   1512 ; CHECK-NEXT:    br i1 %[[V]], label %loop_exit.split.us.loopexit, label %loop_begin.backedge.us
   1513 ;
   1514 ; CHECK:       loop_begin.backedge.us:
   1515 ; CHECK-NEXT:    br label %loop_begin.us
   1516 ;
   1517 ; CHECK:       loop_exit.split.us.loopexit:
   1518 ; CHECK-NEXT:    %[[A_LCSSA_A:.*]] = phi i32 [ %[[A]], %loop_a.us ]
   1519 ; CHECK-NEXT:    br label %loop_exit
   1520 ;
   1521 ; CHECK:       loop_exit.split.us:
   1522 ; CHECK-NEXT:    %[[A_PHI_US:.*]] = phi i32 [ %[[A_LCSSA_B]], %loop_b.us ], [ %[[A_LCSSA_A]], %loop_exit.split.us.loopexit ]
   1523 ; CHECK-NEXT:    br label %loop_exit
   1524 
   1525 ; The original loop without one 'loop_exit' edge.
   1526 ;
   1527 ; CHECK:       entry.split:
   1528 ; CHECK-NEXT:    br label %loop_begin
   1529 ;
   1530 ; CHECK:       loop_begin:
   1531 ; CHECK-NEXT:    %[[A:.*]] = load i32, i32* %a.ptr
   1532 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
   1533 ; CHECK-NEXT:    br i1 %[[V]], label %loop_a, label %loop_b
   1534 ;
   1535 ; CHECK:       loop_a:
   1536 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
   1537 ; CHECK-NEXT:    br i1 %[[V]], label %loop_exit.split, label %loop_begin.backedge
   1538 ;
   1539 ; CHECK:       loop_begin.backedge:
   1540 ; CHECK-NEXT:    br label %loop_begin
   1541 ;
   1542 ; CHECK:       loop_b:
   1543 ; CHECK-NEXT:    br label %loop_begin.backedge
   1544 ;
   1545 ; CHECK:       loop_exit.split:
   1546 ; CHECK-NEXT:    %[[A_LCSSA:.*]] = phi i32 [ %[[A]], %loop_a ]
   1547 ; CHECK-NEXT:    br label %loop_exit
   1548 
   1549 loop_exit:
   1550   %a.lcssa = phi i32 [ %a, %loop_a ], [ %a, %loop_b ]
   1551   ret i32 %a.lcssa
   1552 ; CHECK:       loop_exit:
   1553 ; CHECK-NEXT:    %[[A_PHI:.*]] = phi i32 [ %[[A_LCSSA]], %loop_exit.split ], [ %[[A_PHI_US]], %loop_exit.split.us ]
   1554 ; CHECK-NEXT:    ret i32 %[[A_PHI]]
   1555 }
   1556 
   1557 ; Test that requires re-forming dedicated exits for the original loop.
   1558 define i32 @test10b(i1* %ptr, i1 %cond, i32* %a.ptr) {
   1559 ; CHECK-LABEL: @test10b(
   1560 entry:
   1561   br label %loop_begin
   1562 ; CHECK-NEXT:  entry:
   1563 ; CHECK-NEXT:    br i1 %cond, label %entry.split.us, label %entry.split
   1564 
   1565 loop_begin:
   1566   %a = load i32, i32* %a.ptr
   1567   %v1 = load i1, i1* %ptr
   1568   br i1 %v1, label %loop_a, label %loop_b
   1569 
   1570 loop_a:
   1571   %v2 = load i1, i1* %ptr
   1572   br i1 %v2, label %loop_begin, label %loop_exit
   1573 
   1574 loop_b:
   1575   br i1 %cond, label %loop_begin, label %loop_exit
   1576 ; The cloned loop without one of the exits.
   1577 ;
   1578 ; CHECK:       entry.split.us:
   1579 ; CHECK-NEXT:    br label %loop_begin.us
   1580 ;
   1581 ; CHECK:       loop_begin.us:
   1582 ; CHECK-NEXT:    %[[A:.*]] = load i32, i32* %a.ptr
   1583 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
   1584 ; CHECK-NEXT:    br i1 %[[V]], label %loop_a.us, label %loop_b.us
   1585 ;
   1586 ; CHECK:       loop_b.us:
   1587 ; CHECK-NEXT:    br label %loop_begin.backedge.us
   1588 ;
   1589 ; CHECK:       loop_a.us:
   1590 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
   1591 ; CHECK-NEXT:    br i1 %[[V]], label %loop_begin.backedge.us, label %loop_exit.split.us
   1592 ;
   1593 ; CHECK:       loop_begin.backedge.us:
   1594 ; CHECK-NEXT:    br label %loop_begin.us
   1595 ;
   1596 ; CHECK:       loop_exit.split.us:
   1597 ; CHECK-NEXT:    %[[A_LCSSA_US:.*]] = phi i32 [ %[[A]], %loop_a.us ]
   1598 ; CHECK-NEXT:    br label %loop_exit
   1599 
   1600 ; The original loop without one 'loop_exit' edge.
   1601 ;
   1602 ; CHECK:       entry.split:
   1603 ; CHECK-NEXT:    br label %loop_begin
   1604 ;
   1605 ; CHECK:       loop_begin:
   1606 ; CHECK-NEXT:    %[[A:.*]] = load i32, i32* %a.ptr
   1607 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
   1608 ; CHECK-NEXT:    br i1 %[[V]], label %loop_a, label %loop_b
   1609 ;
   1610 ; CHECK:       loop_a:
   1611 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
   1612 ; CHECK-NEXT:    br i1 %[[V]], label %loop_begin.backedge, label %loop_exit.split.loopexit
   1613 ;
   1614 ; CHECK:       loop_begin.backedge:
   1615 ; CHECK-NEXT:    br label %loop_begin
   1616 ;
   1617 ; CHECK:       loop_b:
   1618 ; CHECK-NEXT:    %[[A_LCSSA_B:.*]] = phi i32 [ %[[A]], %loop_begin ]
   1619 ; CHECK-NEXT:    br label %loop_exit.split
   1620 ;
   1621 ; CHECK:       loop_exit.split.loopexit:
   1622 ; CHECK-NEXT:    %[[A_LCSSA_A:.*]] = phi i32 [ %[[A]], %loop_a ]
   1623 ; CHECK-NEXT:    br label %loop_exit.split
   1624 ;
   1625 ; CHECK:       loop_exit.split:
   1626 ; CHECK-NEXT:    %[[A_PHI_SPLIT:.*]] = phi i32 [ %[[A_LCSSA_B]], %loop_b ], [ %[[A_LCSSA_A]], %loop_exit.split.loopexit ]
   1627 ; CHECK-NEXT:    br label %loop_exit
   1628 
   1629 loop_exit:
   1630   %a.lcssa = phi i32 [ %a, %loop_a ], [ %a, %loop_b ]
   1631   ret i32 %a.lcssa
   1632 ; CHECK:       loop_exit:
   1633 ; CHECK-NEXT:    %[[A_PHI:.*]] = phi i32 [ %[[A_PHI_SPLIT]], %loop_exit.split ], [ %[[A_LCSSA_US]], %loop_exit.split.us ]
   1634 ; CHECK-NEXT:    ret i32 %[[A_PHI]]
   1635 }
   1636 
   1637 ; Check that if a cloned inner loop after unswitching doesn't loop and directly
   1638 ; exits even an outer loop, we don't add the cloned preheader to the outer
   1639 ; loop and do add the needed LCSSA phi nodes for the new exit block from the
   1640 ; outer loop.
   1641 define i32 @test11a(i1* %ptr, i1* %cond.ptr, i32* %a.ptr, i32* %b.ptr) {
   1642 ; CHECK-LABEL: @test11a(
   1643 entry:
   1644   br label %loop_begin
   1645 ; CHECK-NEXT:  entry:
   1646 ; CHECK-NEXT:    br label %loop_begin
   1647 
   1648 loop_begin:
   1649   %b = load i32, i32* %b.ptr
   1650   %v1 = load i1, i1* %ptr
   1651   br i1 %v1, label %loop_latch, label %inner_loop_ph
   1652 ; CHECK:       loop_begin:
   1653 ; CHECK-NEXT:    %[[B:.*]] = load i32, i32* %b.ptr
   1654 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
   1655 ; CHECK-NEXT:    br i1 %[[V]], label %loop_latch, label %inner_loop_ph
   1656 
   1657 inner_loop_ph:
   1658   %cond = load i1, i1* %cond.ptr
   1659   br label %inner_loop_begin
   1660 ; CHECK:       inner_loop_ph:
   1661 ; CHECK-NEXT:    %[[COND:.*]] = load i1, i1* %cond.ptr
   1662 ; CHECK-NEXT:    br i1 %[[COND]], label %inner_loop_ph.split.us, label %inner_loop_ph.split
   1663 
   1664 inner_loop_begin:
   1665   call void @sink1(i32 %b)
   1666   %a = load i32, i32* %a.ptr
   1667   br i1 %cond, label %loop_exit, label %inner_loop_a
   1668 
   1669 inner_loop_a:
   1670   %v2 = load i1, i1* %ptr
   1671   br i1 %v2, label %inner_loop_exit, label %inner_loop_begin
   1672 ; The cloned path doesn't actually loop and is an exit from the outer loop as
   1673 ; well.
   1674 ;
   1675 ; CHECK:       inner_loop_ph.split.us:
   1676 ; CHECK-NEXT:    %[[B_LCSSA:.*]] = phi i32 [ %[[B]], %inner_loop_ph ]
   1677 ; CHECK-NEXT:    br label %inner_loop_begin.us
   1678 ;
   1679 ; CHECK:       inner_loop_begin.us:
   1680 ; CHECK-NEXT:    call void @sink1(i32 %[[B_LCSSA]])
   1681 ; CHECK-NEXT:    %[[A:.*]] = load i32, i32* %a.ptr
   1682 ; CHECK-NEXT:    br label %loop_exit.loopexit.split.us
   1683 ;
   1684 ; CHECK:       loop_exit.loopexit.split.us:
   1685 ; CHECK-NEXT:    %[[A_INNER_LCSSA_US:.*]] = phi i32 [ %[[A]], %inner_loop_begin.us ]
   1686 ; CHECK-NEXT:    br label %loop_exit.loopexit
   1687 ;
   1688 ; The original remains a loop losing the exit edge.
   1689 ;
   1690 ; CHECK:       inner_loop_ph.split:
   1691 ; CHECK-NEXT:    br label %inner_loop_begin
   1692 ;
   1693 ; CHECK:       inner_loop_begin:
   1694 ; CHECK-NEXT:    call void @sink1(i32 %[[B]])
   1695 ; CHECK-NEXT:    %[[A:.*]] = load i32, i32* %a.ptr
   1696 ; CHECK-NEXT:    br label %inner_loop_a
   1697 ;
   1698 ; CHECK:       inner_loop_a:
   1699 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
   1700 ; CHECK-NEXT:    br i1 %[[V]], label %inner_loop_exit, label %inner_loop_begin
   1701 
   1702 inner_loop_exit:
   1703   %a.inner_lcssa = phi i32 [ %a, %inner_loop_a ]
   1704   %v3 = load i1, i1* %ptr
   1705   br i1 %v3, label %loop_latch, label %loop_exit
   1706 ; CHECK:       inner_loop_exit:
   1707 ; CHECK-NEXT:    %[[A_INNER_LCSSA:.*]] = phi i32 [ %[[A]], %inner_loop_a ]
   1708 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
   1709 ; CHECK-NEXT:    br i1 %[[V]], label %loop_latch, label %loop_exit.loopexit1
   1710 
   1711 loop_latch:
   1712   br label %loop_begin
   1713 ; CHECK:       loop_latch:
   1714 ; CHECK-NEXT:    br label %loop_begin
   1715 
   1716 loop_exit:
   1717   %a.lcssa = phi i32 [ %a, %inner_loop_begin ], [ %a.inner_lcssa, %inner_loop_exit ]
   1718   ret i32 %a.lcssa
   1719 ; CHECK:       loop_exit.loopexit:
   1720 ; CHECK-NEXT:    br label %loop_exit
   1721 ;
   1722 ; CHECK:       loop_exit.loopexit1:
   1723 ; CHECK-NEXT:    %[[A_LCSSA:.*]] = phi i32 [ %[[A_INNER_LCSSA]], %inner_loop_exit ]
   1724 ; CHECK-NEXT:    br label %loop_exit
   1725 ;
   1726 ; CHECK:       loop_exit:
   1727 ; CHECK-NEXT:    %[[A_PHI:.*]] = phi i32 [ %[[A_INNER_LCSSA_US]], %loop_exit.loopexit ], [ %[[A_LCSSA]], %loop_exit.loopexit1 ]
   1728 ; CHECK-NEXT:    ret i32 %[[A_PHI]]
   1729 }
   1730 
   1731 ; Check that if the original inner loop after unswitching doesn't loop and
   1732 ; directly exits even an outer loop, we remove the original preheader from the
   1733 ; outer loop and add needed LCSSA phi nodes for the new exit block from the
   1734 ; outer loop.
   1735 define i32 @test11b(i1* %ptr, i1* %cond.ptr, i32* %a.ptr, i32* %b.ptr) {
   1736 ; CHECK-LABEL: @test11b(
   1737 entry:
   1738   br label %loop_begin
   1739 ; CHECK-NEXT:  entry:
   1740 ; CHECK-NEXT:    br label %loop_begin
   1741 
   1742 loop_begin:
   1743   %b = load i32, i32* %b.ptr
   1744   %v1 = load i1, i1* %ptr
   1745   br i1 %v1, label %loop_latch, label %inner_loop_ph
   1746 ; CHECK:       loop_begin:
   1747 ; CHECK-NEXT:    %[[B:.*]] = load i32, i32* %b.ptr
   1748 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
   1749 ; CHECK-NEXT:    br i1 %[[V]], label %loop_latch, label %inner_loop_ph
   1750 
   1751 inner_loop_ph:
   1752   %cond = load i1, i1* %cond.ptr
   1753   br label %inner_loop_begin
   1754 ; CHECK:       inner_loop_ph:
   1755 ; CHECK-NEXT:    %[[COND:.*]] = load i1, i1* %cond.ptr
   1756 ; CHECK-NEXT:    br i1 %[[COND]], label %inner_loop_ph.split.us, label %inner_loop_ph.split
   1757 
   1758 inner_loop_begin:
   1759   call void @sink1(i32 %b)
   1760   %a = load i32, i32* %a.ptr
   1761   br i1 %cond, label %inner_loop_a, label %loop_exit
   1762 
   1763 inner_loop_a:
   1764   %v2 = load i1, i1* %ptr
   1765   br i1 %v2, label %inner_loop_exit, label %inner_loop_begin
   1766 ; The cloned path continues to loop without the exit out of the entire nest.
   1767 ;
   1768 ; CHECK:       inner_loop_ph.split.us:
   1769 ; CHECK-NEXT:    br label %inner_loop_begin.us
   1770 ;
   1771 ; CHECK:       inner_loop_begin.us:
   1772 ; CHECK-NEXT:    call void @sink1(i32 %[[B]])
   1773 ; CHECK-NEXT:    %[[A:.*]] = load i32, i32* %a.ptr
   1774 ; CHECK-NEXT:    br label %inner_loop_a.us
   1775 ;
   1776 ; CHECK:       inner_loop_a.us:
   1777 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
   1778 ; CHECK-NEXT:    br i1 %[[V]], label %inner_loop_exit.split.us, label %inner_loop_begin.us
   1779 ;
   1780 ; CHECK:       inner_loop_exit.split.us:
   1781 ; CHECK-NEXT:    %[[A_INNER_LCSSA_US:.*]] = phi i32 [ %[[A]], %inner_loop_a.us ]
   1782 ; CHECK-NEXT:    br label %inner_loop_exit
   1783 ;
   1784 ; The original remains a loop losing the exit edge.
   1785 ;
   1786 ; CHECK:       inner_loop_ph.split:
   1787 ; CHECK-NEXT:    %[[B_LCSSA:.*]] = phi i32 [ %[[B]], %inner_loop_ph ]
   1788 ; CHECK-NEXT:    br label %inner_loop_begin
   1789 ;
   1790 ; CHECK:       inner_loop_begin:
   1791 ; CHECK-NEXT:    call void @sink1(i32 %[[B_LCSSA]])
   1792 ; CHECK-NEXT:    %[[A:.*]] = load i32, i32* %a.ptr
   1793 ; CHECK-NEXT:    br label %loop_exit.loopexit
   1794 
   1795 inner_loop_exit:
   1796   %a.inner_lcssa = phi i32 [ %a, %inner_loop_a ]
   1797   %v3 = load i1, i1* %ptr
   1798   br i1 %v3, label %loop_latch, label %loop_exit
   1799 ; CHECK:       inner_loop_exit:
   1800 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
   1801 ; CHECK-NEXT:    br i1 %[[V]], label %loop_latch, label %loop_exit.loopexit1
   1802 
   1803 loop_latch:
   1804   br label %loop_begin
   1805 ; CHECK:       loop_latch:
   1806 ; CHECK-NEXT:    br label %loop_begin
   1807 
   1808 loop_exit:
   1809   %a.lcssa = phi i32 [ %a, %inner_loop_begin ], [ %a.inner_lcssa, %inner_loop_exit ]
   1810   ret i32 %a.lcssa
   1811 ; CHECK:       loop_exit.loopexit:
   1812 ; CHECK-NEXT:    %[[A_LCSSA:.*]] = phi i32 [ %[[A]], %inner_loop_begin ]
   1813 ; CHECK-NEXT:    br label %loop_exit
   1814 ;
   1815 ; CHECK:       loop_exit.loopexit1:
   1816 ; CHECK-NEXT:    %[[A_LCSSA_US:.*]] = phi i32 [ %[[A_INNER_LCSSA_US]], %inner_loop_exit ]
   1817 ; CHECK-NEXT:    br label %loop_exit
   1818 ;
   1819 ; CHECK:       loop_exit:
   1820 ; CHECK-NEXT:    %[[A_PHI:.*]] = phi i32 [ %[[A_LCSSA]], %loop_exit.loopexit ], [ %[[A_LCSSA_US]], %loop_exit.loopexit1 ]
   1821 ; CHECK-NEXT:    ret i32 %[[A_PHI]]
   1822 }
   1823 
   1824 ; Like test11a, but checking that when the whole thing is wrapped in yet
   1825 ; another loop, we correctly attribute the cloned preheader to that outermost
   1826 ; loop rather than only handling the case where the preheader is not in any loop
   1827 ; at all.
   1828 define i32 @test12a(i1* %ptr, i1* %cond.ptr, i32* %a.ptr, i32* %b.ptr) {
   1829 ; CHECK-LABEL: @test12a(
   1830 entry:
   1831   br label %loop_begin
   1832 ; CHECK-NEXT:  entry:
   1833 ; CHECK-NEXT:    br label %loop_begin
   1834 
   1835 loop_begin:
   1836   br label %inner_loop_begin
   1837 ; CHECK:       loop_begin:
   1838 ; CHECK-NEXT:    br label %inner_loop_begin
   1839 
   1840 inner_loop_begin:
   1841   %b = load i32, i32* %b.ptr
   1842   %v1 = load i1, i1* %ptr
   1843   br i1 %v1, label %inner_loop_latch, label %inner_inner_loop_ph
   1844 ; CHECK:       inner_loop_begin:
   1845 ; CHECK-NEXT:    %[[B:.*]] = load i32, i32* %b.ptr
   1846 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
   1847 ; CHECK-NEXT:    br i1 %[[V]], label %inner_loop_latch, label %inner_inner_loop_ph
   1848 
   1849 inner_inner_loop_ph:
   1850   %cond = load i1, i1* %cond.ptr
   1851   br label %inner_inner_loop_begin
   1852 ; CHECK:       inner_inner_loop_ph:
   1853 ; CHECK-NEXT:    %[[COND:.*]] = load i1, i1* %cond.ptr
   1854 ; CHECK-NEXT:    br i1 %[[COND]], label %inner_inner_loop_ph.split.us, label %inner_inner_loop_ph.split
   1855 
   1856 inner_inner_loop_begin:
   1857   call void @sink1(i32 %b)
   1858   %a = load i32, i32* %a.ptr
   1859   br i1 %cond, label %inner_loop_exit, label %inner_inner_loop_a
   1860 
   1861 inner_inner_loop_a:
   1862   %v2 = load i1, i1* %ptr
   1863   br i1 %v2, label %inner_inner_loop_exit, label %inner_inner_loop_begin
   1864 ; The cloned path doesn't actually loop and is an exit from the outer loop as
   1865 ; well.
   1866 ;
   1867 ; CHECK:       inner_inner_loop_ph.split.us:
   1868 ; CHECK-NEXT:    %[[B_LCSSA:.*]] = phi i32 [ %[[B]], %inner_inner_loop_ph ]
   1869 ; CHECK-NEXT:    br label %inner_inner_loop_begin.us
   1870 ;
   1871 ; CHECK:       inner_inner_loop_begin.us:
   1872 ; CHECK-NEXT:    call void @sink1(i32 %[[B_LCSSA]])
   1873 ; CHECK-NEXT:    %[[A:.*]] = load i32, i32* %a.ptr
   1874 ; CHECK-NEXT:    br label %inner_loop_exit.loopexit.split.us
   1875 ;
   1876 ; CHECK:       inner_loop_exit.loopexit.split.us:
   1877 ; CHECK-NEXT:    %[[A_INNER_INNER_LCSSA_US:.*]] = phi i32 [ %[[A]], %inner_inner_loop_begin.us ]
   1878 ; CHECK-NEXT:    br label %inner_loop_exit.loopexit
   1879 ;
   1880 ; The original remains a loop losing the exit edge.
   1881 ;
   1882 ; CHECK:       inner_inner_loop_ph.split:
   1883 ; CHECK-NEXT:    br label %inner_inner_loop_begin
   1884 ;
   1885 ; CHECK:       inner_inner_loop_begin:
   1886 ; CHECK-NEXT:    call void @sink1(i32 %[[B]])
   1887 ; CHECK-NEXT:    %[[A:.*]] = load i32, i32* %a.ptr
   1888 ; CHECK-NEXT:    br label %inner_inner_loop_a
   1889 ;
   1890 ; CHECK:       inner_inner_loop_a:
   1891 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
   1892 ; CHECK-NEXT:    br i1 %[[V]], label %inner_inner_loop_exit, label %inner_inner_loop_begin
   1893 
   1894 inner_inner_loop_exit:
   1895   %a.inner_inner_lcssa = phi i32 [ %a, %inner_inner_loop_a ]
   1896   %v3 = load i1, i1* %ptr
   1897   br i1 %v3, label %inner_loop_latch, label %inner_loop_exit
   1898 ; CHECK:       inner_inner_loop_exit:
   1899 ; CHECK-NEXT:    %[[A_INNER_INNER_LCSSA:.*]] = phi i32 [ %[[A]], %inner_inner_loop_a ]
   1900 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
   1901 ; CHECK-NEXT:    br i1 %[[V]], label %inner_loop_latch, label %inner_loop_exit.loopexit1
   1902 
   1903 inner_loop_latch:
   1904   br label %inner_loop_begin
   1905 ; CHECK:       inner_loop_latch:
   1906 ; CHECK-NEXT:    br label %inner_loop_begin
   1907 
   1908 inner_loop_exit:
   1909   %a.inner_lcssa = phi i32 [ %a, %inner_inner_loop_begin ], [ %a.inner_inner_lcssa, %inner_inner_loop_exit ]
   1910   %v4 = load i1, i1* %ptr
   1911   br i1 %v4, label %loop_begin, label %loop_exit
   1912 ; CHECK:       inner_loop_exit.loopexit:
   1913 ; CHECK-NEXT:    br label %inner_loop_exit
   1914 ;
   1915 ; CHECK:       inner_loop_exit.loopexit1:
   1916 ; CHECK-NEXT:    %[[A_INNER_LCSSA:.*]] = phi i32 [ %[[A_INNER_INNER_LCSSA]], %inner_inner_loop_exit ]
   1917 ; CHECK-NEXT:    br label %inner_loop_exit
   1918 ;
   1919 ; CHECK:       inner_loop_exit:
   1920 ; CHECK-NEXT:    %[[A_INNER_PHI:.*]] = phi i32 [ %[[A_INNER_INNER_LCSSA_US]], %inner_loop_exit.loopexit ], [ %[[A_INNER_LCSSA]], %inner_loop_exit.loopexit1 ]
   1921 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
   1922 ; CHECK-NEXT:    br i1 %[[V]], label %loop_begin, label %loop_exit
   1923 
   1924 loop_exit:
   1925   %a.lcssa = phi i32 [ %a.inner_lcssa, %inner_loop_exit ]
   1926   ret i32 %a.lcssa
   1927 ; CHECK:       loop_exit:
   1928 ; CHECK-NEXT:    %[[A_LCSSA:.*]] = phi i32 [ %[[A_INNER_PHI]], %inner_loop_exit ]
   1929 ; CHECK-NEXT:    ret i32 %[[A_LCSSA]]
   1930 }
   1931 
   1932 ; Like test11b, but checking that when the whole thing is wrapped in yet
   1933 ; another loop, we correctly sink the preheader to the outermost loop rather
   1934 ; than only handling the case where the preheader is completely removed from
   1935 ; a loop.
   1936 define i32 @test12b(i1* %ptr, i1* %cond.ptr, i32* %a.ptr, i32* %b.ptr) {
   1937 ; CHECK-LABEL: @test12b(
   1938 entry:
   1939   br label %loop_begin
   1940 ; CHECK-NEXT:  entry:
   1941 ; CHECK-NEXT:    br label %loop_begin
   1942 
   1943 loop_begin:
   1944   br label %inner_loop_begin
   1945 ; CHECK:       loop_begin:
   1946 ; CHECK-NEXT:    br label %inner_loop_begin
   1947 
   1948 inner_loop_begin:
   1949   %b = load i32, i32* %b.ptr
   1950   %v1 = load i1, i1* %ptr
   1951   br i1 %v1, label %inner_loop_latch, label %inner_inner_loop_ph
   1952 ; CHECK:       inner_loop_begin:
   1953 ; CHECK-NEXT:    %[[B:.*]] = load i32, i32* %b.ptr
   1954 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
   1955 ; CHECK-NEXT:    br i1 %[[V]], label %inner_loop_latch, label %inner_inner_loop_ph
   1956 
   1957 inner_inner_loop_ph:
   1958   %cond = load i1, i1* %cond.ptr
   1959   br label %inner_inner_loop_begin
   1960 ; CHECK:       inner_inner_loop_ph:
   1961 ; CHECK-NEXT:    %[[COND:.*]] = load i1, i1* %cond.ptr
   1962 ; CHECK-NEXT:    br i1 %[[COND]], label %inner_inner_loop_ph.split.us, label %inner_inner_loop_ph.split
   1963 
   1964 inner_inner_loop_begin:
   1965   call void @sink1(i32 %b)
   1966   %a = load i32, i32* %a.ptr
   1967   br i1 %cond, label %inner_inner_loop_a, label %inner_loop_exit
   1968 
   1969 inner_inner_loop_a:
   1970   %v2 = load i1, i1* %ptr
   1971   br i1 %v2, label %inner_inner_loop_exit, label %inner_inner_loop_begin
   1972 ; The cloned path continues to loop without the exit out of the entire nest.
   1973 ;
   1974 ; CHECK:       inner_inner_loop_ph.split.us:
   1975 ; CHECK-NEXT:    br label %inner_inner_loop_begin.us
   1976 ;
   1977 ; CHECK:       inner_inner_loop_begin.us:
   1978 ; CHECK-NEXT:    call void @sink1(i32 %[[B]])
   1979 ; CHECK-NEXT:    %[[A:.*]] = load i32, i32* %a.ptr
   1980 ; CHECK-NEXT:    br label %inner_inner_loop_a.us
   1981 ;
   1982 ; CHECK:       inner_inner_loop_a.us:
   1983 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
   1984 ; CHECK-NEXT:    br i1 %[[V]], label %inner_inner_loop_exit.split.us, label %inner_inner_loop_begin.us
   1985 ;
   1986 ; CHECK:       inner_inner_loop_exit.split.us:
   1987 ; CHECK-NEXT:    %[[A_INNER_INNER_LCSSA_US:.*]] = phi i32 [ %[[A]], %inner_inner_loop_a.us ]
   1988 ; CHECK-NEXT:    br label %inner_inner_loop_exit
   1989 ;
   1990 ; The original remains a loop losing the exit edge.
   1991 ;
   1992 ; CHECK:       inner_inner_loop_ph.split:
   1993 ; CHECK-NEXT:    %[[B_LCSSA:.*]] = phi i32 [ %[[B]], %inner_inner_loop_ph ]
   1994 ; CHECK-NEXT:    br label %inner_inner_loop_begin
   1995 ;
   1996 ; CHECK:       inner_inner_loop_begin:
   1997 ; CHECK-NEXT:    call void @sink1(i32 %[[B_LCSSA]])
   1998 ; CHECK-NEXT:    %[[A:.*]] = load i32, i32* %a.ptr
   1999 ; CHECK-NEXT:    br label %inner_loop_exit.loopexit
   2000 
   2001 inner_inner_loop_exit:
   2002   %a.inner_inner_lcssa = phi i32 [ %a, %inner_inner_loop_a ]
   2003   %v3 = load i1, i1* %ptr
   2004   br i1 %v3, label %inner_loop_latch, label %inner_loop_exit
   2005 ; CHECK:       inner_inner_loop_exit:
   2006 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
   2007 ; CHECK-NEXT:    br i1 %[[V]], label %inner_loop_latch, label %inner_loop_exit.loopexit1
   2008 
   2009 inner_loop_latch:
   2010   br label %inner_loop_begin
   2011 ; CHECK:       inner_loop_latch:
   2012 ; CHECK-NEXT:    br label %inner_loop_begin
   2013 
   2014 inner_loop_exit:
   2015   %a.inner_lcssa = phi i32 [ %a, %inner_inner_loop_begin ], [ %a.inner_inner_lcssa, %inner_inner_loop_exit ]
   2016   %v4 = load i1, i1* %ptr
   2017   br i1 %v4, label %loop_begin, label %loop_exit
   2018 ; CHECK:       inner_loop_exit.loopexit:
   2019 ; CHECK-NEXT:    %[[A_INNER_LCSSA:.*]] = phi i32 [ %[[A]], %inner_inner_loop_begin ]
   2020 ; CHECK-NEXT:    br label %inner_loop_exit
   2021 ;
   2022 ; CHECK:       inner_loop_exit.loopexit1:
   2023 ; CHECK-NEXT:    %[[A_INNER_LCSSA_US:.*]] = phi i32 [ %[[A_INNER_INNER_LCSSA_US]], %inner_inner_loop_exit ]
   2024 ; CHECK-NEXT:    br label %inner_loop_exit
   2025 ;
   2026 ; CHECK:       inner_loop_exit:
   2027 ; CHECK-NEXT:    %[[A_INNER_PHI:.*]] = phi i32 [ %[[A_INNER_LCSSA]], %inner_loop_exit.loopexit ], [ %[[A_INNER_LCSSA_US]], %inner_loop_exit.loopexit1 ]
   2028 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
   2029 ; CHECK-NEXT:    br i1 %[[V]], label %loop_begin, label %loop_exit
   2030 
   2031 loop_exit:
   2032   %a.lcssa = phi i32 [ %a.inner_lcssa, %inner_loop_exit ]
   2033   ret i32 %a.lcssa
   2034 ; CHECK:       loop_exit:
   2035 ; CHECK-NEXT:    %[[A_LCSSA:.*]] = phi i32 [ %[[A_INNER_PHI]], %inner_loop_exit ]
   2036 ; CHECK-NEXT:    ret i32 %[[A_LCSSA]]
   2037 }
   2038 
   2039 ; Test where the cloned loop has an inner loop that has to be traversed to form
   2040 ; the cloned loop, and where this inner loop has multiple blocks, and where the
   2041 ; exiting block that connects the inner loop to the cloned loop is not the header
   2042 ; block. This ensures that we correctly handle interesting corner cases of
   2043 ; traversing back to the header when establishing the cloned loop.
   2044 define i32 @test13a(i1* %ptr, i1 %cond, i32* %a.ptr, i32* %b.ptr) {
   2045 ; CHECK-LABEL: @test13a(
   2046 entry:
   2047   br label %loop_begin
   2048 ; CHECK-NEXT:  entry:
   2049 ; CHECK-NEXT:    br i1 %cond, label %entry.split.us, label %entry.split
   2050 
   2051 loop_begin:
   2052   %a = load i32, i32* %a.ptr
   2053   %v1 = load i1, i1* %ptr
   2054   br i1 %v1, label %loop_a, label %loop_b
   2055 
   2056 loop_a:
   2057   %v2 = load i1, i1* %ptr
   2058   br i1 %v2, label %loop_exit, label %loop_latch
   2059 
   2060 loop_b:
   2061   %b = load i32, i32* %b.ptr
   2062   br i1 %cond, label %loop_b_inner_ph, label %loop_exit
   2063 
   2064 loop_b_inner_ph:
   2065   br label %loop_b_inner_header
   2066 
   2067 loop_b_inner_header:
   2068   %v3 = load i1, i1* %ptr
   2069   br i1 %v3, label %loop_b_inner_latch, label %loop_b_inner_body
   2070 
   2071 loop_b_inner_body:
   2072   %v4 = load i1, i1* %ptr
   2073   br i1 %v4, label %loop_b_inner_latch, label %loop_b_inner_exit
   2074 
   2075 loop_b_inner_latch:
   2076   br label %loop_b_inner_header
   2077 
   2078 loop_b_inner_exit:
   2079   br label %loop_latch
   2080 
   2081 loop_latch:
   2082   br label %loop_begin
   2083 ; The cloned loop contains an inner loop within it.
   2084 ;
   2085 ; CHECK:       entry.split.us:
   2086 ; CHECK-NEXT:    br label %loop_begin.us
   2087 ;
   2088 ; CHECK:       loop_begin.us:
   2089 ; CHECK-NEXT:    %[[A:.*]] = load i32, i32* %a.ptr
   2090 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
   2091 ; CHECK-NEXT:    br i1 %[[V]], label %loop_a.us, label %loop_b.us
   2092 ;
   2093 ; CHECK:       loop_b.us:
   2094 ; CHECK-NEXT:    %[[B:.*]] = load i32, i32* %b.ptr
   2095 ; CHECK-NEXT:    br label %loop_b_inner_ph.us
   2096 ;
   2097 ; CHECK:       loop_b_inner_ph.us:
   2098 ; CHECK-NEXT:    br label %loop_b_inner_header.us
   2099 ;
   2100 ; CHECK:       loop_b_inner_header.us:
   2101 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
   2102 ; CHECK-NEXT:    br i1 %[[V]], label %loop_b_inner_latch.us, label %loop_b_inner_body.us
   2103 ;
   2104 ; CHECK:       loop_b_inner_body.us:
   2105 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
   2106 ; CHECK-NEXT:    br i1 %[[V]], label %loop_b_inner_latch.us, label %loop_b_inner_exit.us
   2107 ;
   2108 ; CHECK:       loop_b_inner_exit.us:
   2109 ; CHECK-NEXT:    br label %loop_latch.us
   2110 ;
   2111 ; CHECK:       loop_b_inner_latch.us:
   2112 ; CHECK-NEXT:    br label %loop_b_inner_header.us
   2113 ;
   2114 ; CHECK:       loop_a.us:
   2115 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
   2116 ; CHECK-NEXT:    br i1 %[[V]], label %loop_exit.split.us, label %loop_latch.us
   2117 ;
   2118 ; CHECK:       loop_latch.us:
   2119 ; CHECK-NEXT:    br label %loop_begin.us
   2120 ;
   2121 ; CHECK:       loop_exit.split.us:
   2122 ; CHECK-NEXT:    %[[A_LCSSA_US:.*]] = phi i32 [ %[[A]], %loop_a.us ]
   2123 ; CHECK-NEXT:    br label %loop_exit
   2124 ;
   2125 ; And the original loop no longer contains an inner loop.
   2126 ;
   2127 ; CHECK:       entry.split:
   2128 ; CHECK-NEXT:    br label %loop_begin
   2129 ;
   2130 ; CHECK:       loop_begin:
   2131 ; CHECK-NEXT:    %[[A:.*]] = load i32, i32* %a.ptr
   2132 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
   2133 ; CHECK-NEXT:    br i1 %[[V]], label %loop_a, label %loop_b
   2134 ;
   2135 ; CHECK:       loop_a:
   2136 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
   2137 ; CHECK-NEXT:    br i1 %[[V]], label %loop_exit.split.loopexit, label %loop_latch
   2138 ;
   2139 ; CHECK:       loop_b:
   2140 ; CHECK-NEXT:    %[[B:.*]] = load i32, i32* %b.ptr
   2141 ; CHECK-NEXT:    br label %loop_exit.split
   2142 ;
   2143 ; CHECK:       loop_latch:
   2144 ; CHECK-NEXT:    br label %loop_begin
   2145 
   2146 loop_exit:
   2147   %lcssa = phi i32 [ %a, %loop_a ], [ %b, %loop_b ]
   2148   ret i32 %lcssa
   2149 ; CHECK:       loop_exit.split.loopexit:
   2150 ; CHECK-NEXT:    %[[A_LCSSA:.*]] = phi i32 [ %[[A]], %loop_a ]
   2151 ; CHECK-NEXT:    br label %loop_exit.split
   2152 ;
   2153 ; CHECK:       loop_exit.split:
   2154 ; CHECK-NEXT:    %[[AB_PHI:.*]] = phi i32 [ %[[B]], %loop_b ], [ %[[A_LCSSA]], %loop_exit.split.loopexit ]
   2155 ; CHECK-NEXT:    br label %loop_exit
   2156 ;
   2157 ; CHECK:       loop_exit:
   2158 ; CHECK-NEXT:    %[[AB_PHI_US:.*]] = phi i32 [ %[[AB_PHI]], %loop_exit.split ], [ %[[A_LCSSA_US]], %loop_exit.split.us ]
   2159 ; CHECK-NEXT:    ret i32 %[[AB_PHI_US]]
   2160 }
   2161 
   2162 ; Test where the original loop has an inner loop that has to be traversed to
   2163 ; rebuild the loop, and where this inner loop has multiple blocks, and where
   2164 ; the exiting block that connects the inner loop to the original loop is not
   2165 ; the header block. This ensures that we correctly handle interesting corner
   2166 ; cases of traversing back to the header when re-establishing the original loop
   2167 ; still exists after unswitching.
   2168 define i32 @test13b(i1* %ptr, i1 %cond, i32* %a.ptr, i32* %b.ptr) {
   2169 ; CHECK-LABEL: @test13b(
   2170 entry:
   2171   br label %loop_begin
   2172 ; CHECK-NEXT:  entry:
   2173 ; CHECK-NEXT:    br i1 %cond, label %entry.split.us, label %entry.split
   2174 
   2175 loop_begin:
   2176   %a = load i32, i32* %a.ptr
   2177   %v1 = load i1, i1* %ptr
   2178   br i1 %v1, label %loop_a, label %loop_b
   2179 
   2180 loop_a:
   2181   %v2 = load i1, i1* %ptr
   2182   br i1 %v2, label %loop_exit, label %loop_latch
   2183 
   2184 loop_b:
   2185   %b = load i32, i32* %b.ptr
   2186   br i1 %cond, label %loop_exit, label %loop_b_inner_ph
   2187 
   2188 loop_b_inner_ph:
   2189   br label %loop_b_inner_header
   2190 
   2191 loop_b_inner_header:
   2192   %v3 = load i1, i1* %ptr
   2193   br i1 %v3, label %loop_b_inner_latch, label %loop_b_inner_body
   2194 
   2195 loop_b_inner_body:
   2196   %v4 = load i1, i1* %ptr
   2197   br i1 %v4, label %loop_b_inner_latch, label %loop_b_inner_exit
   2198 
   2199 loop_b_inner_latch:
   2200   br label %loop_b_inner_header
   2201 
   2202 loop_b_inner_exit:
   2203   br label %loop_latch
   2204 
   2205 loop_latch:
   2206   br label %loop_begin
   2207 ; The cloned loop doesn't contain an inner loop.
   2208 ;
   2209 ; CHECK:       entry.split.us:
   2210 ; CHECK-NEXT:    br label %loop_begin.us
   2211 ;
   2212 ; CHECK:       loop_begin.us:
   2213 ; CHECK-NEXT:    %[[A:.*]] = load i32, i32* %a.ptr
   2214 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
   2215 ; CHECK-NEXT:    br i1 %[[V]], label %loop_a.us, label %loop_b.us
   2216 ;
   2217 ; CHECK:       loop_b.us:
   2218 ; CHECK-NEXT:    %[[B:.*]] = load i32, i32* %b.ptr
   2219 ; CHECK-NEXT:    br label %loop_exit.split.us
   2220 ;
   2221 ; CHECK:       loop_a.us:
   2222 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
   2223 ; CHECK-NEXT:    br i1 %[[V]], label %loop_exit.split.us.loopexit, label %loop_latch.us
   2224 ;
   2225 ; CHECK:       loop_latch.us:
   2226 ; CHECK-NEXT:    br label %loop_begin.us
   2227 ;
   2228 ; CHECK:       loop_exit.split.us.loopexit:
   2229 ; CHECK-NEXT:    %[[A_LCSSA_US:.*]] = phi i32 [ %[[A]], %loop_a.us ]
   2230 ; CHECK-NEXT:    br label %loop_exit.split.us
   2231 ;
   2232 ; CHECK:       loop_exit.split.us:
   2233 ; CHECK-NEXT:    %[[AB_PHI_US:.*]] = phi i32 [ %[[B]], %loop_b.us ], [ %[[A_LCSSA_US]], %loop_exit.split.us.loopexit ]
   2234 ; CHECK-NEXT:    br label %loop_exit
   2235 ;
   2236 ; But the original loop contains an inner loop that must be traversed.;
   2237 ;
   2238 ; CHECK:       entry.split:
   2239 ; CHECK-NEXT:    br label %loop_begin
   2240 ;
   2241 ; CHECK:       loop_begin:
   2242 ; CHECK-NEXT:    %[[A:.*]] = load i32, i32* %a.ptr
   2243 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
   2244 ; CHECK-NEXT:    br i1 %[[V]], label %loop_a, label %loop_b
   2245 ;
   2246 ; CHECK:       loop_a:
   2247 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
   2248 ; CHECK-NEXT:    br i1 %[[V]], label %loop_exit.split, label %loop_latch
   2249 ;
   2250 ; CHECK:       loop_b:
   2251 ; CHECK-NEXT:    %[[B:.*]] = load i32, i32* %b.ptr
   2252 ; CHECK-NEXT:    br label %loop_b_inner_ph
   2253 ;
   2254 ; CHECK:       loop_b_inner_ph:
   2255 ; CHECK-NEXT:    br label %loop_b_inner_header
   2256 ;
   2257 ; CHECK:       loop_b_inner_header:
   2258 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
   2259 ; CHECK-NEXT:    br i1 %[[V]], label %loop_b_inner_latch, label %loop_b_inner_body
   2260 ;
   2261 ; CHECK:       loop_b_inner_body:
   2262 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
   2263 ; CHECK-NEXT:    br i1 %[[V]], label %loop_b_inner_latch, label %loop_b_inner_exit
   2264 ;
   2265 ; CHECK:       loop_b_inner_latch:
   2266 ; CHECK-NEXT:    br label %loop_b_inner_header
   2267 ;
   2268 ; CHECK:       loop_b_inner_exit:
   2269 ; CHECK-NEXT:    br label %loop_latch
   2270 ;
   2271 ; CHECK:       loop_latch:
   2272 ; CHECK-NEXT:    br label %loop_begin
   2273 
   2274 loop_exit:
   2275   %lcssa = phi i32 [ %a, %loop_a ], [ %b, %loop_b ]
   2276   ret i32 %lcssa
   2277 ; CHECK:       loop_exit.split:
   2278 ; CHECK-NEXT:    %[[A_LCSSA:.*]] = phi i32 [ %[[A]], %loop_a ]
   2279 ; CHECK-NEXT:    br label %loop_exit
   2280 ;
   2281 ; CHECK:       loop_exit:
   2282 ; CHECK-NEXT:    %[[AB_PHI:.*]] = phi i32 [ %[[A_LCSSA]], %loop_exit.split ], [ %[[AB_PHI_US]], %loop_exit.split.us ]
   2283 ; CHECK-NEXT:    ret i32 %[[AB_PHI]]
   2284 }
   2285 
   2286 define i32 @test20(i32* %var, i32 %cond1, i32 %cond2) {
   2287 ; CHECK-LABEL: @test20(
   2288 entry:
   2289   br label %loop_begin
   2290 ; CHECK-NEXT:  entry:
   2291 ; CHECK-NEXT:    switch i32 %cond2, label %[[ENTRY_SPLIT_EXIT:.*]] [
   2292 ; CHECK-NEXT:      i32 0, label %[[ENTRY_SPLIT_A:.*]]
   2293 ; CHECK-NEXT:      i32 1, label %[[ENTRY_SPLIT_A]]
   2294 ; CHECK-NEXT:      i32 13, label %[[ENTRY_SPLIT_B:.*]]
   2295 ; CHECK-NEXT:      i32 2, label %[[ENTRY_SPLIT_A]]
   2296 ; CHECK-NEXT:      i32 42, label %[[ENTRY_SPLIT_C:.*]]
   2297 ; CHECK-NEXT:    ]
   2298 
   2299 loop_begin:
   2300   %var_val = load i32, i32* %var
   2301   switch i32 %cond2, label %loop_exit [
   2302     i32 0, label %loop_a
   2303     i32 1, label %loop_a
   2304     i32 13, label %loop_b
   2305     i32 2, label %loop_a
   2306     i32 42, label %loop_c
   2307   ]
   2308 
   2309 loop_a:
   2310   call i32 @a()
   2311   br label %loop_latch
   2312 ; Unswitched 'a' loop.
   2313 ;
   2314 ; CHECK:       [[ENTRY_SPLIT_A]]:
   2315 ; CHECK-NEXT:    br label %[[LOOP_BEGIN_A:.*]]
   2316 ;
   2317 ; CHECK:       [[LOOP_BEGIN_A]]:
   2318 ; CHECK-NEXT:    %{{.*}} = load i32, i32* %var
   2319 ; CHECK-NEXT:    br label %[[LOOP_A:.*]]
   2320 ;
   2321 ; CHECK:       [[LOOP_A]]:
   2322 ; CHECK-NEXT:    call i32 @a()
   2323 ; CHECK-NEXT:    br label %[[LOOP_LATCH_A:.*]]
   2324 ;
   2325 ; CHECK:       [[LOOP_LATCH_A]]:
   2326 ; CHECK:         br label %[[LOOP_BEGIN_A]]
   2327 
   2328 loop_b:
   2329   call i32 @b()
   2330   br label %loop_latch
   2331 ; Unswitched 'b' loop.
   2332 ;
   2333 ; CHECK:       [[ENTRY_SPLIT_B]]:
   2334 ; CHECK-NEXT:    br label %[[LOOP_BEGIN_B:.*]]
   2335 ;
   2336 ; CHECK:       [[LOOP_BEGIN_B]]:
   2337 ; CHECK-NEXT:    %{{.*}} = load i32, i32* %var
   2338 ; CHECK-NEXT:    br label %[[LOOP_B:.*]]
   2339 ;
   2340 ; CHECK:       [[LOOP_B]]:
   2341 ; CHECK-NEXT:    call i32 @b()
   2342 ; CHECK-NEXT:    br label %[[LOOP_LATCH_B:.*]]
   2343 ;
   2344 ; CHECK:       [[LOOP_LATCH_B]]:
   2345 ; CHECK:         br label %[[LOOP_BEGIN_B]]
   2346 
   2347 loop_c:
   2348   call i32 @c() noreturn nounwind
   2349   br label %loop_latch
   2350 ; Unswitched 'c' loop.
   2351 ;
   2352 ; CHECK:       [[ENTRY_SPLIT_C]]:
   2353 ; CHECK-NEXT:    br label %[[LOOP_BEGIN_C:.*]]
   2354 ;
   2355 ; CHECK:       [[LOOP_BEGIN_C]]:
   2356 ; CHECK-NEXT:    %{{.*}} = load i32, i32* %var
   2357 ; CHECK-NEXT:    br label %[[LOOP_C:.*]]
   2358 ;
   2359 ; CHECK:       [[LOOP_C]]:
   2360 ; CHECK-NEXT:    call i32 @c()
   2361 ; CHECK-NEXT:    br label %[[LOOP_LATCH_C:.*]]
   2362 ;
   2363 ; CHECK:       [[LOOP_LATCH_C]]:
   2364 ; CHECK:         br label %[[LOOP_BEGIN_C]]
   2365 
   2366 loop_latch:
   2367   br label %loop_begin
   2368 
   2369 loop_exit:
   2370   %lcssa = phi i32 [ %var_val, %loop_begin ]
   2371   ret i32 %lcssa
   2372 ; Unswitched exit edge (no longer a loop).
   2373 ;
   2374 ; CHECK:       [[ENTRY_SPLIT_EXIT]]:
   2375 ; CHECK-NEXT:    br label %loop_begin
   2376 ;
   2377 ; CHECK:       loop_begin:
   2378 ; CHECK-NEXT:    %[[V:.*]] = load i32, i32* %var
   2379 ; CHECK-NEXT:    br label %loop_exit
   2380 ;
   2381 ; CHECK:       loop_exit:
   2382 ; CHECK-NEXT:    %[[LCSSA:.*]] = phi i32 [ %[[V]], %loop_begin ]
   2383 ; CHECK-NEXT:    ret i32 %[[LCSSA]]
   2384 }
   2385 
   2386 ; Negative test: we do not switch when the loop contains unstructured control
   2387 ; flows as it would significantly complicate the process as novel loops might
   2388 ; be formed, etc.
   2389 define void @test_no_unswitch_unstructured_cfg(i1* %ptr, i1 %cond) {
   2390 ; CHECK-LABEL: @test_no_unswitch_unstructured_cfg(
   2391 entry:
   2392   br label %loop_begin
   2393 
   2394 loop_begin:
   2395   br i1 %cond, label %loop_left, label %loop_right
   2396 
   2397 loop_left:
   2398   %v1 = load i1, i1* %ptr
   2399   br i1 %v1, label %loop_right, label %loop_merge
   2400 
   2401 loop_right:
   2402   %v2 = load i1, i1* %ptr
   2403   br i1 %v2, label %loop_left, label %loop_merge
   2404 
   2405 loop_merge:
   2406   %v3 = load i1, i1* %ptr
   2407   br i1 %v3, label %loop_latch, label %loop_exit
   2408 
   2409 loop_latch:
   2410   br label %loop_begin
   2411 
   2412 loop_exit:
   2413   ret void
   2414 }
   2415 
   2416 ; A test reduced out of 403.gcc with interesting nested loops that trigger
   2417 ; multiple unswitches. A key component of this test is that there are multiple
   2418 ; paths to reach an inner loop after unswitching, and one of them is via the
   2419 ; predecessors of the unswitched loop header. That can allow us to find the loop
   2420 ; through multiple different paths.
   2421 define void @test21(i1 %a, i1 %b) {
   2422 ; CHECK-LABEL: @test21(
   2423 bb:
   2424   br label %bb3
   2425 ; CHECK-NOT:     br i1 %a
   2426 ;
   2427 ; CHECK:         br i1 %a, label %[[BB_SPLIT_US:.*]], label %[[BB_SPLIT:.*]]
   2428 ;
   2429 ; CHECK-NOT:     br i1 %a
   2430 ; CHECK-NOT:     br i1 %b
   2431 ;
   2432 ; CHECK:       [[BB_SPLIT]]:
   2433 ; CHECK:         br i1 %b
   2434 ;
   2435 ; CHECK-NOT:     br i1 %a
   2436 ; CHECK-NOT:     br i1 %b
   2437 
   2438 bb3:
   2439   %tmp1.0 = phi i32 [ 0, %bb ], [ %tmp1.3, %bb23 ]
   2440   br label %bb7
   2441 
   2442 bb7:
   2443   %tmp.0 = phi i1 [ true, %bb3 ], [ false, %bb19 ]
   2444   %tmp1.1 = phi i32 [ %tmp1.0, %bb3 ], [ %tmp1.2.lcssa, %bb19 ]
   2445   br i1 %tmp.0, label %bb11.preheader, label %bb23
   2446 
   2447 bb11.preheader:
   2448   br i1 %a, label %bb19, label %bb14.lr.ph
   2449 
   2450 bb14.lr.ph:
   2451   br label %bb14
   2452 
   2453 bb14:
   2454   %tmp2.02 = phi i32 [ 0, %bb14.lr.ph ], [ 1, %bb14 ]
   2455   br i1 %b, label %bb11.bb19_crit_edge, label %bb14
   2456 
   2457 bb11.bb19_crit_edge:
   2458   %split = phi i32 [ %tmp2.02, %bb14 ]
   2459   br label %bb19
   2460 
   2461 bb19:
   2462   %tmp1.2.lcssa = phi i32 [ %split, %bb11.bb19_crit_edge ], [ %tmp1.1, %bb11.preheader ]
   2463   %tmp21 = icmp eq i32 %tmp1.2.lcssa, 0
   2464   br i1 %tmp21, label %bb23, label %bb7
   2465 
   2466 bb23:
   2467   %tmp1.3 = phi i32 [ %tmp1.2.lcssa, %bb19 ], [ %tmp1.1, %bb7 ]
   2468   br label %bb3
   2469 }
   2470 
   2471 ; A test reduced out of 400.perlbench that when unswitching the `%stop`
   2472 ; condition clones a loop nest outside of a containing loop. This excercises a
   2473 ; different cloning path from our other test cases and in turn verifying the
   2474 ; resulting structure can catch any failures to correctly clone these nested
   2475 ; loops.
   2476 declare void @f()
   2477 declare void @g()
   2478 declare i32 @h(i32 %arg)
   2479 define void @test22(i32 %arg) {
   2480 ; CHECK-LABEL: define void @test22(
   2481 entry:
   2482   br label %loop1.header
   2483 
   2484 loop1.header:
   2485   %stop = phi i1 [ true, %loop1.latch ], [ false, %entry ]
   2486   %i = phi i32 [ %i.lcssa, %loop1.latch ], [ %arg, %entry ]
   2487 ; CHECK:         %[[I:.*]] = phi i32 [ %{{.*}}, %loop1.latch ], [ %arg, %entry ]
   2488   br i1 %stop, label %loop1.exit, label %loop1.body.loop2.ph
   2489 ; CHECK:         br i1 %stop, label %loop1.exit, label %loop1.body.loop2.ph
   2490 
   2491 loop1.body.loop2.ph:
   2492   br label %loop2.header
   2493 ; Just check that the we unswitched the key condition and that leads to the
   2494 ; inner loop header.
   2495 ;
   2496 ; CHECK:       loop1.body.loop2.ph:
   2497 ; CHECK-NEXT:    br i1 %stop, label %[[SPLIT_US:.*]], label %[[SPLIT:.*]]
   2498 ;
   2499 ; CHECK:       [[SPLIT_US]]:
   2500 ; CHECK-NEXT:    br label %[[LOOP2_HEADER_US:.*]]
   2501 ;
   2502 ; CHECK:       [[LOOP2_HEADER_US]]:
   2503 ; CHECK-NEXT:    %{{.*}} = phi i32 [ %[[I]], %[[SPLIT_US]] ]
   2504 ;
   2505 ; CHECK:       [[SPLIT]]:
   2506 ; CHECK-NEXT:    br label %[[LOOP2_HEADER:.*]]
   2507 ;
   2508 ; CHECK:       [[LOOP2_HEADER]]:
   2509 ; CHECK-NEXT:    %{{.*}} = phi i32 [ %[[I]], %[[SPLIT]] ]
   2510 
   2511 loop2.header:
   2512   %i.inner = phi i32 [ %i, %loop1.body.loop2.ph ], [ %i.next, %loop2.latch ]
   2513   br label %loop3.header
   2514 
   2515 loop3.header:
   2516   %sw = call i32 @h(i32 %i.inner)
   2517   switch i32 %sw, label %loop3.exit [
   2518     i32 32, label %loop3.header
   2519     i32 59, label %loop2.latch
   2520     i32 36, label %loop1.latch
   2521   ]
   2522 
   2523 loop2.latch:
   2524   %i.next = add i32 %i.inner, 1
   2525   br i1 %stop, label %loop2.exit, label %loop2.header
   2526 
   2527 loop1.latch:
   2528   %i.lcssa = phi i32 [ %i.inner, %loop3.header ]
   2529   br label %loop1.header
   2530 
   2531 loop3.exit:
   2532   call void @f()
   2533   ret void
   2534 
   2535 loop2.exit:
   2536   call void @g()
   2537   ret void
   2538 
   2539 loop1.exit:
   2540   call void @g()
   2541   ret void
   2542 }
   2543 
   2544 ; Test that when we are unswitching and need to rebuild the loop block set we
   2545 ; correctly skip past inner loops. We want to use the inner loop to efficiently
   2546 ; skip whole subregions of the outer loop blocks but just because the header of
   2547 ; the outer loop is also the preheader of an inner loop shouldn't confuse this
   2548 ; walk.
   2549 define void @test23(i1 %arg, i1* %ptr) {
   2550 ; CHECK-LABEL: define void @test23(
   2551 entry:
   2552   br label %outer.header
   2553 ; CHECK:       entry:
   2554 ; CHECK-NEXT:    br i1 %arg,
   2555 ;
   2556 ; Just verify that we unswitched the correct bits. We should call `@f` twice in
   2557 ; one unswitch and `@f` and then `@g` in the other.
   2558 ; CHECK:         call void
   2559 ; CHECK-SAME:              @f
   2560 ; CHECK:         call void
   2561 ; CHECK-SAME:              @f
   2562 ;
   2563 ; CHECK:         call void
   2564 ; CHECK-SAME:              @f
   2565 ; CHECK:         call void
   2566 ; CHECK-SAME:              @g
   2567 
   2568 outer.header:
   2569   br label %inner.header
   2570 
   2571 inner.header:
   2572   call void @f()
   2573   br label %inner.latch
   2574 
   2575 inner.latch:
   2576   %inner.cond = load i1, i1* %ptr
   2577   br i1 %inner.cond, label %inner.header, label %outer.body
   2578 
   2579 outer.body:
   2580   br i1 %arg, label %outer.body.left, label %outer.body.right
   2581 
   2582 outer.body.left:
   2583   call void @f()
   2584   br label %outer.latch
   2585 
   2586 outer.body.right:
   2587   call void @g()
   2588   br label %outer.latch
   2589 
   2590 outer.latch:
   2591   %outer.cond = load i1, i1* %ptr
   2592   br i1 %outer.cond, label %outer.header, label %exit
   2593 
   2594 exit:
   2595   ret void
   2596 }
   2597 
   2598 ; Non-trivial loop unswitching where there are two invariant conditions, but the
   2599 ; second one is only in the cloned copy of the loop after unswitching.
   2600 define i32 @test24(i1* %ptr, i1 %cond1, i1 %cond2) {
   2601 ; CHECK-LABEL: @test24(
   2602 entry:
   2603   br label %loop_begin
   2604 ; CHECK-NEXT:  entry:
   2605 ; CHECK-NEXT:    br i1 %cond1, label %entry.split.us, label %entry.split
   2606 
   2607 loop_begin:
   2608   br i1 %cond1, label %loop_a, label %loop_b
   2609 
   2610 loop_a:
   2611   br i1 %cond2, label %loop_a_a, label %loop_a_c
   2612 ; The second unswitched condition.
   2613 ;
   2614 ; CHECK:       entry.split.us:
   2615 ; CHECK-NEXT:    br i1 %cond2, label %entry.split.us.split.us, label %entry.split.us.split
   2616 
   2617 loop_a_a:
   2618   call i32 @a()
   2619   br label %latch
   2620 ; The 'loop_a_a' unswitched loop.
   2621 ;
   2622 ; CHECK:       entry.split.us.split.us:
   2623 ; CHECK-NEXT:    br label %loop_begin.us.us
   2624 ;
   2625 ; CHECK:       loop_begin.us.us:
   2626 ; CHECK-NEXT:    br label %loop_a.us.us
   2627 ;
   2628 ; CHECK:       loop_a.us.us:
   2629 ; CHECK-NEXT:    br label %loop_a_a.us.us
   2630 ;
   2631 ; CHECK:       loop_a_a.us.us:
   2632 ; CHECK-NEXT:    call i32 @a()
   2633 ; CHECK-NEXT:    br label %latch.us.us
   2634 ;
   2635 ; CHECK:       latch.us.us:
   2636 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
   2637 ; CHECK-NEXT:    br i1 %[[V]], label %loop_begin.us.us, label %loop_exit.split.us.split.us
   2638 ;
   2639 ; CHECK:       loop_exit.split.us.split.us:
   2640 ; CHECK-NEXT:    br label %loop_exit.split
   2641 
   2642 loop_a_c:
   2643   call i32 @c()
   2644   br label %latch
   2645 ; The 'loop_a_c' unswitched loop.
   2646 ;
   2647 ; CHECK:       entry.split.us.split:
   2648 ; CHECK-NEXT:    br label %loop_begin.us
   2649 ;
   2650 ; CHECK:       loop_begin.us:
   2651 ; CHECK-NEXT:    br label %loop_a.us
   2652 ;
   2653 ; CHECK:       loop_a.us:
   2654 ; CHECK-NEXT:    br label %loop_a_c.us
   2655 ;
   2656 ; CHECK:       loop_a_c.us:
   2657 ; CHECK-NEXT:    call i32 @c()
   2658 ; CHECK-NEXT:    br label %latch
   2659 ;
   2660 ; CHECK:       latch.us:
   2661 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
   2662 ; CHECK-NEXT:    br i1 %[[V]], label %loop_begin.us, label %loop_exit.split.us.split
   2663 ;
   2664 ; CHECK:       loop_exit.split.us.split:
   2665 ; CHECK-NEXT:    br label %loop_exit.split
   2666 
   2667 loop_b:
   2668   call i32 @b()
   2669   br label %latch
   2670 ; The 'loop_b' unswitched loop.
   2671 ;
   2672 ; CHECK:       entry.split:
   2673 ; CHECK-NEXT:    br label %loop_begin
   2674 ;
   2675 ; CHECK:       loop_begin:
   2676 ; CHECK-NEXT:    br label %loop_b
   2677 ;
   2678 ; CHECK:       loop_b:
   2679 ; CHECK-NEXT:    call i32 @b()
   2680 ; CHECK-NEXT:    br label %latch
   2681 ;
   2682 ; CHECK:       latch:
   2683 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
   2684 ; CHECK-NEXT:    br i1 %[[V]], label %loop_begin, label %loop_exit.split
   2685 ;
   2686 ; CHECK:       loop_exit.split:
   2687 ; CHECK-NEXT:    br label %loop_exit
   2688 
   2689 latch:
   2690   %v = load i1, i1* %ptr
   2691   br i1 %v, label %loop_begin, label %loop_exit
   2692 
   2693 loop_exit:
   2694   ret i32 0
   2695 ; CHECK:       loop_exit:
   2696 ; CHECK-NEXT:    ret
   2697 }
   2698 
   2699 ; Non-trivial partial loop unswitching of an invariant input to an 'or'.
   2700 define i32 @test25(i1* %ptr, i1 %cond) {
   2701 ; CHECK-LABEL: @test25(
   2702 entry:
   2703   br label %loop_begin
   2704 ; CHECK-NEXT:  entry:
   2705 ; CHECK-NEXT:    br i1 %cond, label %entry.split.us, label %entry.split
   2706 
   2707 loop_begin:
   2708   %v1 = load i1, i1* %ptr
   2709   %cond_or = or i1 %v1, %cond
   2710   br i1 %cond_or, label %loop_a, label %loop_b
   2711 
   2712 loop_a:
   2713   call i32 @a()
   2714   br label %latch
   2715 ; The 'loop_a' unswitched loop.
   2716 ;
   2717 ; CHECK:       entry.split.us:
   2718 ; CHECK-NEXT:    br label %loop_begin.us
   2719 ;
   2720 ; CHECK:       loop_begin.us:
   2721 ; CHECK-NEXT:    %[[V1_US:.*]] = load i1, i1* %ptr
   2722 ; CHECK-NEXT:    %[[OR_US:.*]] = or i1 %[[V1_US]], true
   2723 ; CHECK-NEXT:    br label %loop_a.us
   2724 ;
   2725 ; CHECK:       loop_a.us:
   2726 ; CHECK-NEXT:    call i32 @a()
   2727 ; CHECK-NEXT:    br label %latch.us
   2728 ;
   2729 ; CHECK:       latch.us:
   2730 ; CHECK-NEXT:    %[[V2_US:.*]] = load i1, i1* %ptr
   2731 ; CHECK-NEXT:    br i1 %[[V2_US]], label %loop_begin.us, label %loop_exit.split.us
   2732 ;
   2733 ; CHECK:       loop_exit.split.us:
   2734 ; CHECK-NEXT:    br label %loop_exit
   2735 
   2736 loop_b:
   2737   call i32 @b()
   2738   br label %latch
   2739 ; The original loop.
   2740 ;
   2741 ; CHECK:       entry.split:
   2742 ; CHECK-NEXT:    br label %loop_begin
   2743 ;
   2744 ; CHECK:       loop_begin:
   2745 ; CHECK-NEXT:    %[[V1:.*]] = load i1, i1* %ptr
   2746 ; CHECK-NEXT:    %[[OR:.*]] = or i1 %[[V1]], false
   2747 ; CHECK-NEXT:    br i1 %[[OR]], label %loop_a, label %loop_b
   2748 ;
   2749 ; CHECK:       loop_a:
   2750 ; CHECK-NEXT:    call i32 @a()
   2751 ; CHECK-NEXT:    br label %latch
   2752 ;
   2753 ; CHECK:       loop_b:
   2754 ; CHECK-NEXT:    call i32 @b()
   2755 ; CHECK-NEXT:    br label %latch
   2756 
   2757 latch:
   2758   %v2 = load i1, i1* %ptr
   2759   br i1 %v2, label %loop_begin, label %loop_exit
   2760 ; CHECK:       latch:
   2761 ; CHECK-NEXT:    %[[V2:.*]] = load i1, i1* %ptr
   2762 ; CHECK-NEXT:    br i1 %[[V2]], label %loop_begin, label %loop_exit.split
   2763 
   2764 loop_exit:
   2765   ret i32 0
   2766 ; CHECK:       loop_exit.split:
   2767 ; CHECK-NEXT:    br label %loop_exit
   2768 ;
   2769 ; CHECK:       loop_exit:
   2770 ; CHECK-NEXT:    ret
   2771 }
   2772 
   2773 ; Non-trivial partial loop unswitching of multiple invariant inputs to an `and`
   2774 ; chain.
   2775 define i32 @test26(i1* %ptr1, i1* %ptr2, i1* %ptr3, i1 %cond1, i1 %cond2, i1 %cond3) {
   2776 ; CHECK-LABEL: @test26(
   2777 entry:
   2778   br label %loop_begin
   2779 ; CHECK-NEXT:  entry:
   2780 ; CHECK-NEXT:    %[[INV_AND:.*]] = and i1 %cond3, %cond1
   2781 ; CHECK-NEXT:    br i1 %[[INV_AND]], label %entry.split, label %entry.split.us
   2782 
   2783 loop_begin:
   2784   %v1 = load i1, i1* %ptr1
   2785   %v2 = load i1, i1* %ptr2
   2786   %cond_and1 = and i1 %v1, %cond1
   2787   %cond_or1 = or i1 %v2, %cond2
   2788   %cond_and2 = and i1 %cond_and1, %cond_or1
   2789   %cond_and3 = and i1 %cond_and2, %cond3
   2790   br i1 %cond_and3, label %loop_a, label %loop_b
   2791 ; The 'loop_b' unswitched loop.
   2792 ;
   2793 ; CHECK:       entry.split.us:
   2794 ; CHECK-NEXT:    br label %loop_begin.us
   2795 ;
   2796 ; CHECK:       loop_begin.us:
   2797 ; CHECK-NEXT:    %[[V1_US:.*]] = load i1, i1* %ptr1
   2798 ; CHECK-NEXT:    %[[V2_US:.*]] = load i1, i1* %ptr2
   2799 ; CHECK-NEXT:    %[[AND1_US:.*]] = and i1 %[[V1_US]], false
   2800 ; CHECK-NEXT:    %[[OR1_US:.*]] = or i1 %[[V2_US]], %cond2
   2801 ; CHECK-NEXT:    %[[AND2_US:.*]] = and i1 %[[AND1_US]], %[[OR1_US]]
   2802 ; CHECK-NEXT:    %[[AND3_US:.*]] = and i1 %[[AND2_US]], false
   2803 ; CHECK-NEXT:    br label %loop_b.us
   2804 ;
   2805 ; CHECK:       loop_b.us:
   2806 ; CHECK-NEXT:    call i32 @b()
   2807 ; CHECK-NEXT:    br label %latch.us
   2808 ;
   2809 ; CHECK:       latch.us:
   2810 ; CHECK-NEXT:    %[[V3_US:.*]] = load i1, i1* %ptr3
   2811 ; CHECK-NEXT:    br i1 %[[V3_US]], label %loop_begin.us, label %loop_exit.split.us
   2812 ;
   2813 ; CHECK:       loop_exit.split.us:
   2814 ; CHECK-NEXT:    br label %loop_exit
   2815 
   2816 ; The original loop.
   2817 ;
   2818 ; CHECK:       entry.split:
   2819 ; CHECK-NEXT:    br label %loop_begin
   2820 ;
   2821 ; CHECK:       loop_begin:
   2822 ; CHECK-NEXT:    %[[V1:.*]] = load i1, i1* %ptr1
   2823 ; CHECK-NEXT:    %[[V2:.*]] = load i1, i1* %ptr2
   2824 ; CHECK-NEXT:    %[[AND1:.*]] = and i1 %[[V1]], true
   2825 ; CHECK-NEXT:    %[[OR1:.*]] = or i1 %[[V2]], %cond2
   2826 ; CHECK-NEXT:    %[[AND2:.*]] = and i1 %[[AND1]], %[[OR1]]
   2827 ; CHECK-NEXT:    %[[AND3:.*]] = and i1 %[[AND2]], true
   2828 ; CHECK-NEXT:    br i1 %[[AND3]], label %loop_a, label %loop_b
   2829 
   2830 loop_a:
   2831   call i32 @a()
   2832   br label %latch
   2833 ; CHECK:       loop_a:
   2834 ; CHECK-NEXT:    call i32 @a()
   2835 ; CHECK-NEXT:    br label %latch
   2836 
   2837 loop_b:
   2838   call i32 @b()
   2839   br label %latch
   2840 ; CHECK:       loop_b:
   2841 ; CHECK-NEXT:    call i32 @b()
   2842 ; CHECK-NEXT:    br label %latch
   2843 
   2844 latch:
   2845   %v3 = load i1, i1* %ptr3
   2846   br i1 %v3, label %loop_begin, label %loop_exit
   2847 ; CHECK:       latch:
   2848 ; CHECK-NEXT:    %[[V3:.*]] = load i1, i1* %ptr3
   2849 ; CHECK-NEXT:    br i1 %[[V3]], label %loop_begin, label %loop_exit.split
   2850 
   2851 loop_exit:
   2852   ret i32 0
   2853 ; CHECK:       loop_exit.split:
   2854 ; CHECK-NEXT:    br label %loop_exit
   2855 ;
   2856 ; CHECK:       loop_exit:
   2857 ; CHECK-NEXT:    ret
   2858 }
   2859 
   2860 ; Non-trivial unswitching of a switch.
   2861 define i32 @test27(i1* %ptr, i32 %cond) {
   2862 ; CHECK-LABEL: @test27(
   2863 entry:
   2864   br label %loop_begin
   2865 ; CHECK-NEXT:  entry:
   2866 ; CHECK-NEXT:    switch i32 %cond, label %[[ENTRY_SPLIT_LATCH:.*]] [
   2867 ; CHECK-NEXT:      i32 0, label %[[ENTRY_SPLIT_A:.*]]
   2868 ; CHECK-NEXT:      i32 1, label %[[ENTRY_SPLIT_B:.*]]
   2869 ; CHECK-NEXT:      i32 2, label %[[ENTRY_SPLIT_C:.*]]
   2870 ; CHECK-NEXT:    ]
   2871 
   2872 loop_begin:
   2873   switch i32 %cond, label %latch [
   2874     i32 0, label %loop_a
   2875     i32 1, label %loop_b
   2876     i32 2, label %loop_c
   2877   ]
   2878 
   2879 loop_a:
   2880   call i32 @a()
   2881   br label %latch
   2882 ; Unswitched 'a' loop.
   2883 ;
   2884 ; CHECK:       [[ENTRY_SPLIT_A]]:
   2885 ; CHECK-NEXT:    br label %[[LOOP_BEGIN_A:.*]]
   2886 ;
   2887 ; CHECK:       [[LOOP_BEGIN_A]]:
   2888 ; CHECK-NEXT:    br label %[[LOOP_A:.*]]
   2889 ;
   2890 ; CHECK:       [[LOOP_A]]:
   2891 ; CHECK-NEXT:    call i32 @a()
   2892 ; CHECK-NEXT:    br label %[[LOOP_LATCH_A:.*]]
   2893 ;
   2894 ; CHECK:       [[LOOP_LATCH_A]]:
   2895 ; CHECK-NEXT:    %[[V_A:.*]] = load i1, i1* %ptr
   2896 ; CHECK:         br i1 %[[V_A]], label %[[LOOP_BEGIN_A]], label %[[LOOP_EXIT_A:.*]]
   2897 ;
   2898 ; CHECK:       [[LOOP_EXIT_A]]:
   2899 ; CHECK-NEXT:    br label %loop_exit
   2900 
   2901 loop_b:
   2902   call i32 @b()
   2903   br label %latch
   2904 ; Unswitched 'b' loop.
   2905 ;
   2906 ; CHECK:       [[ENTRY_SPLIT_B]]:
   2907 ; CHECK-NEXT:    br label %[[LOOP_BEGIN_B:.*]]
   2908 ;
   2909 ; CHECK:       [[LOOP_BEGIN_B]]:
   2910 ; CHECK-NEXT:    br label %[[LOOP_B:.*]]
   2911 ;
   2912 ; CHECK:       [[LOOP_B]]:
   2913 ; CHECK-NEXT:    call i32 @b()
   2914 ; CHECK-NEXT:    br label %[[LOOP_LATCH_B:.*]]
   2915 ;
   2916 ; CHECK:       [[LOOP_LATCH_B]]:
   2917 ; CHECK-NEXT:    %[[V_B:.*]] = load i1, i1* %ptr
   2918 ; CHECK:         br i1 %[[V_B]], label %[[LOOP_BEGIN_B]], label %[[LOOP_EXIT_B:.*]]
   2919 ;
   2920 ; CHECK:       [[LOOP_EXIT_B]]:
   2921 ; CHECK-NEXT:    br label %loop_exit
   2922 
   2923 loop_c:
   2924   call i32 @c()
   2925   br label %latch
   2926 ; Unswitched 'c' loop.
   2927 ;
   2928 ; CHECK:       [[ENTRY_SPLIT_C]]:
   2929 ; CHECK-NEXT:    br label %[[LOOP_BEGIN_C:.*]]
   2930 ;
   2931 ; CHECK:       [[LOOP_BEGIN_C]]:
   2932 ; CHECK-NEXT:    br label %[[LOOP_C:.*]]
   2933 ;
   2934 ; CHECK:       [[LOOP_C]]:
   2935 ; CHECK-NEXT:    call i32 @c()
   2936 ; CHECK-NEXT:    br label %[[LOOP_LATCH_C:.*]]
   2937 ;
   2938 ; CHECK:       [[LOOP_LATCH_C]]:
   2939 ; CHECK-NEXT:    %[[V_C:.*]] = load i1, i1* %ptr
   2940 ; CHECK:         br i1 %[[V_C]], label %[[LOOP_BEGIN_C]], label %[[LOOP_EXIT_C:.*]]
   2941 ;
   2942 ; CHECK:       [[LOOP_EXIT_C]]:
   2943 ; CHECK-NEXT:    br label %loop_exit
   2944 
   2945 latch:
   2946   %v = load i1, i1* %ptr
   2947   br i1 %v, label %loop_begin, label %loop_exit
   2948 ; Unswitched the 'latch' only loop.
   2949 ;
   2950 ; CHECK:       [[ENTRY_SPLIT_LATCH]]:
   2951 ; CHECK-NEXT:    br label %[[LOOP_BEGIN_LATCH:.*]]
   2952 ;
   2953 ; CHECK:       [[LOOP_BEGIN_LATCH]]:
   2954 ; CHECK-NEXT:    br label %[[LOOP_LATCH_LATCH:.*]]
   2955 ;
   2956 ; CHECK:       [[LOOP_LATCH_LATCH]]:
   2957 ; CHECK-NEXT:    %[[V_LATCH:.*]] = load i1, i1* %ptr
   2958 ; CHECK:         br i1 %[[V_LATCH]], label %[[LOOP_BEGIN_LATCH]], label %[[LOOP_EXIT_LATCH:.*]]
   2959 ;
   2960 ; CHECK:       [[LOOP_EXIT_LATCH]]:
   2961 ; CHECK-NEXT:    br label %loop_exit
   2962 
   2963 loop_exit:
   2964   ret i32 0
   2965 ; CHECK:       loop_exit:
   2966 ; CHECK-NEXT:    ret i32 0
   2967 }
   2968 
   2969 ; A test case designed to exercise unusual properties of switches: they
   2970 ; can introduce multiple edges to successors. These need lots of special case
   2971 ; handling as they get collapsed in many cases (domtree, the unswitch itself)
   2972 ; but not in all cases (the PHI node operands).
   2973 define i32 @test28(i32 %arg) {
   2974 ; CHECK-LABEL: @test28(
   2975 entry:
   2976   br label %header
   2977 ; CHECK-NEXT:  entry:
   2978 ; CHECK-NEXT:    switch i32 %arg, label %[[ENTRY_SPLIT_C:.*]] [
   2979 ; CHECK-NEXT:      i32 0, label %[[ENTRY_SPLIT_A:.*]]
   2980 ; CHECK-NEXT:      i32 1, label %[[ENTRY_SPLIT_A]]
   2981 ; CHECK-NEXT:      i32 2, label %[[ENTRY_SPLIT_B:.*]]
   2982 ; CHECK-NEXT:      i32 3, label %[[ENTRY_SPLIT_C]]
   2983 ; CHECK-NEXT:    ]
   2984 
   2985 header:
   2986   %tmp = call i32 @d()
   2987   %cmp1 = icmp eq i32 %tmp, 0
   2988   ; We set up a chain through all the successors of the switch that doesn't
   2989   ; involve the switch so that we can have interesting PHI nodes in them.
   2990   br i1 %cmp1, label %body.a, label %dispatch
   2991 
   2992 dispatch:
   2993   ; Switch with multiple successors. We arrange the last successor to be the
   2994   ; default to make the test case easier to read. This has a duplicate edge
   2995   ; both to the default destination (which is completely superfluous but
   2996   ; technically valid IR) and to a regular successor.
   2997   switch i32 %arg, label %body.c [
   2998     i32 0, label %body.a
   2999     i32 1, label %body.a
   3000     i32 2, label %body.b
   3001     i32 3, label %body.c
   3002   ]
   3003 
   3004 body.a:
   3005   %tmp.a.phi = phi i32 [ 0, %header ], [ %tmp, %dispatch ], [ %tmp, %dispatch ]
   3006   %tmp.a = call i32 @a()
   3007   %tmp.a.sum = add i32 %tmp.a.phi, %tmp.a
   3008   br label %body.b
   3009 ; Unswitched 'a' loop.
   3010 ;
   3011 ; CHECK:       [[ENTRY_SPLIT_A]]:
   3012 ; CHECK-NEXT:    br label %[[HEADER_A:.*]]
   3013 ;
   3014 ; CHECK:       [[HEADER_A]]:
   3015 ; CHECK-NEXT:    %[[TMP_A:.*]] = call i32 @d()
   3016 ; CHECK-NEXT:    %[[CMP1_A:.*]] = icmp eq i32 %[[TMP_A]], 0
   3017 ; CHECK-NEXT:    br i1 %[[CMP1_A]], label %[[BODY_A_A:.*]], label %[[DISPATCH_A:.*]]
   3018 ;
   3019 ; CHECK:       [[DISPATCH_A]]:
   3020 ; CHECK-NEXT:    br label %[[BODY_A_A]]
   3021 ;
   3022 ; CHECK:       [[BODY_A_A]]:
   3023 ; CHECK-NEXT:    %[[TMP_A_PHI_A:.*]] = phi i32 [ 0, %[[HEADER_A]] ], [ %[[TMP_A]], %[[DISPATCH_A]] ]
   3024 ; CHECK-NEXT:    %[[TMP_A_A:.*]] = call i32 @a()
   3025 ; CHECK-NEXT:    %[[TMP_A_SUM_A:.*]] = add i32 %[[TMP_A_PHI_A]], %[[TMP_A_A]]
   3026 ; CHECK-NEXT:    br label %[[BODY_B_A:.*]]
   3027 ;
   3028 ; CHECK:       [[BODY_B_A]]:
   3029 ; CHECK-NEXT:    %[[TMP_B_PHI_A:.*]] = phi i32 [ %[[TMP_A_SUM_A]], %[[BODY_A_A]] ]
   3030 ; CHECK-NEXT:    %[[TMP_B_A:.*]] = call i32 @b()
   3031 ; CHECK-NEXT:    %[[TMP_B_SUM_A:.*]] = add i32 %[[TMP_B_PHI_A]], %[[TMP_B_A]]
   3032 ; CHECK-NEXT:    br label %[[BODY_C_A:.*]]
   3033 ;
   3034 ; CHECK:       [[BODY_C_A]]:
   3035 ; CHECK-NEXT:    %[[TMP_C_PHI_A:.*]] = phi i32 [ %[[TMP_B_SUM_A]], %[[BODY_B_A]] ]
   3036 ; CHECK-NEXT:    %[[TMP_C_A:.*]] = call i32 @c()
   3037 ; CHECK-NEXT:    %[[TMP_C_SUM_A:.*]] = add i32 %[[TMP_C_PHI_A]], %[[TMP_C_A]]
   3038 ; CHECK-NEXT:    br label %[[LATCH_A:.*]]
   3039 ;
   3040 ; CHECK:       [[LATCH_A]]:
   3041 ; CHECK-NEXT:    %[[CMP2_A:.*]] = icmp slt i32 %[[TMP_C_SUM_A]], 42
   3042 ; CHECK:         br i1 %[[CMP2_A]], label %[[HEADER_A]], label %[[LOOP_EXIT_A:.*]]
   3043 ;
   3044 ; CHECK:       [[LOOP_EXIT_A]]:
   3045 ; CHECK-NEXT:    %[[LCSSA_A:.*]] = phi i32 [ %[[TMP_C_SUM_A]], %[[LATCH_A]] ]
   3046 ; CHECK-NEXT:    br label %exit
   3047 
   3048 body.b:
   3049   %tmp.b.phi = phi i32 [ %tmp, %dispatch ], [ %tmp.a.sum, %body.a ]
   3050   %tmp.b = call i32 @b()
   3051   %tmp.b.sum = add i32 %tmp.b.phi, %tmp.b
   3052   br label %body.c
   3053 ; Unswitched 'b' loop.
   3054 ;
   3055 ; CHECK:       [[ENTRY_SPLIT_B]]:
   3056 ; CHECK-NEXT:    br label %[[HEADER_B:.*]]
   3057 ;
   3058 ; CHECK:       [[HEADER_B]]:
   3059 ; CHECK-NEXT:    %[[TMP_B:.*]] = call i32 @d()
   3060 ; CHECK-NEXT:    %[[CMP1_B:.*]] = icmp eq i32 %[[TMP_B]], 0
   3061 ; CHECK-NEXT:    br i1 %[[CMP1_B]], label %[[BODY_A_B:.*]], label %[[DISPATCH_B:.*]]
   3062 ;
   3063 ; CHECK:       [[DISPATCH_B]]:
   3064 ; CHECK-NEXT:    br label %[[BODY_B_B:.*]]
   3065 ;
   3066 ; CHECK:       [[BODY_A_B]]:
   3067 ; CHECK-NEXT:    %[[TMP_A_PHI_B:.*]] = phi i32 [ 0, %[[HEADER_B]] ]
   3068 ; CHECK-NEXT:    %[[TMP_A_B:.*]] = call i32 @a()
   3069 ; CHECK-NEXT:    %[[TMP_A_SUM_B:.*]] = add i32 %[[TMP_A_PHI_B]], %[[TMP_A_B]]
   3070 ; CHECK-NEXT:    br label %[[BODY_B_B:.*]]
   3071 ;
   3072 ; CHECK:       [[BODY_B_B]]:
   3073 ; CHECK-NEXT:    %[[TMP_B_PHI_B:.*]] = phi i32 [ %[[TMP_B]], %[[DISPATCH_B]] ], [ %[[TMP_A_SUM_B]], %[[BODY_A_B]] ]
   3074 ; CHECK-NEXT:    %[[TMP_B_B:.*]] = call i32 @b()
   3075 ; CHECK-NEXT:    %[[TMP_B_SUM_B:.*]] = add i32 %[[TMP_B_PHI_B]], %[[TMP_B_B]]
   3076 ; CHECK-NEXT:    br label %[[BODY_C_B:.*]]
   3077 ;
   3078 ; CHECK:       [[BODY_C_B]]:
   3079 ; CHECK-NEXT:    %[[TMP_C_PHI_B:.*]] = phi i32 [ %[[TMP_B_SUM_B]], %[[BODY_B_B]] ]
   3080 ; CHECK-NEXT:    %[[TMP_C_B:.*]] = call i32 @c()
   3081 ; CHECK-NEXT:    %[[TMP_C_SUM_B:.*]] = add i32 %[[TMP_C_PHI_B]], %[[TMP_C_B]]
   3082 ; CHECK-NEXT:    br label %[[LATCH_B:.*]]
   3083 ;
   3084 ; CHECK:       [[LATCH_B]]:
   3085 ; CHECK-NEXT:    %[[CMP2_B:.*]] = icmp slt i32 %[[TMP_C_SUM_B]], 42
   3086 ; CHECK:         br i1 %[[CMP2_B]], label %[[HEADER_B]], label %[[LOOP_EXIT_B:.*]]
   3087 ;
   3088 ; CHECK:       [[LOOP_EXIT_B]]:
   3089 ; CHECK-NEXT:    %[[LCSSA_B:.*]] = phi i32 [ %[[TMP_C_SUM_B]], %[[LATCH_B]] ]
   3090 ; CHECK-NEXT:    br label %[[EXIT_SPLIT:.*]]
   3091 
   3092 body.c:
   3093   %tmp.c.phi = phi i32 [ %tmp, %dispatch ], [ %tmp, %dispatch ], [ %tmp.b.sum, %body.b ]
   3094   %tmp.c = call i32 @c()
   3095   %tmp.c.sum = add i32 %tmp.c.phi, %tmp.c
   3096   br label %latch
   3097 ; Unswitched 'c' loop.
   3098 ;
   3099 ; CHECK:       [[ENTRY_SPLIT_C]]:
   3100 ; CHECK-NEXT:    br label %[[HEADER_C:.*]]
   3101 ;
   3102 ; CHECK:       [[HEADER_C]]:
   3103 ; CHECK-NEXT:    %[[TMP_C:.*]] = call i32 @d()
   3104 ; CHECK-NEXT:    %[[CMP1_C:.*]] = icmp eq i32 %[[TMP_C]], 0
   3105 ; CHECK-NEXT:    br i1 %[[CMP1_C]], label %[[BODY_A_C:.*]], label %[[DISPATCH_C:.*]]
   3106 ;
   3107 ; CHECK:       [[DISPATCH_C]]:
   3108 ; CHECK-NEXT:    br label %[[BODY_C_C:.*]]
   3109 ;
   3110 ; CHECK:       [[BODY_A_C]]:
   3111 ; CHECK-NEXT:    %[[TMP_A_PHI_C:.*]] = phi i32 [ 0, %[[HEADER_C]] ]
   3112 ; CHECK-NEXT:    %[[TMP_A_C:.*]] = call i32 @a()
   3113 ; CHECK-NEXT:    %[[TMP_A_SUM_C:.*]] = add i32 %[[TMP_A_PHI_C]], %[[TMP_A_C]]
   3114 ; CHECK-NEXT:    br label %[[BODY_B_C:.*]]
   3115 ;
   3116 ; CHECK:       [[BODY_B_C]]:
   3117 ; CHECK-NEXT:    %[[TMP_B_PHI_C:.*]] = phi i32 [ %[[TMP_A_SUM_C]], %[[BODY_A_C]] ]
   3118 ; CHECK-NEXT:    %[[TMP_B_C:.*]] = call i32 @b()
   3119 ; CHECK-NEXT:    %[[TMP_B_SUM_C:.*]] = add i32 %[[TMP_B_PHI_C]], %[[TMP_B_C]]
   3120 ; CHECK-NEXT:    br label %[[BODY_C_C:.*]]
   3121 ;
   3122 ; CHECK:       [[BODY_C_C]]:
   3123 ; CHECK-NEXT:    %[[TMP_C_PHI_C:.*]] = phi i32 [ %[[TMP_C]], %[[DISPATCH_C]] ], [ %[[TMP_B_SUM_C]], %[[BODY_B_C]] ]
   3124 ; CHECK-NEXT:    %[[TMP_C_C:.*]] = call i32 @c()
   3125 ; CHECK-NEXT:    %[[TMP_C_SUM_C:.*]] = add i32 %[[TMP_C_PHI_C]], %[[TMP_C_C]]
   3126 ; CHECK-NEXT:    br label %[[LATCH_C:.*]]
   3127 ;
   3128 ; CHECK:       [[LATCH_C]]:
   3129 ; CHECK-NEXT:    %[[CMP2_C:.*]] = icmp slt i32 %[[TMP_C_SUM_C]], 42
   3130 ; CHECK:         br i1 %[[CMP2_C]], label %[[HEADER_C]], label %[[LOOP_EXIT_C:.*]]
   3131 ;
   3132 ; CHECK:       [[LOOP_EXIT_C]]:
   3133 ; CHECK-NEXT:    %[[LCSSA_C:.*]] = phi i32 [ %[[TMP_C_SUM_C]], %[[LATCH_C]] ]
   3134 ; CHECK-NEXT:    br label %[[EXIT_SPLIT]]
   3135 
   3136 latch:
   3137   %cmp2 = icmp slt i32 %tmp.c.sum, 42
   3138   br i1 %cmp2, label %header, label %exit
   3139 
   3140 exit:
   3141   %lcssa.phi = phi i32 [ %tmp.c.sum, %latch ]
   3142   ret i32 %lcssa.phi
   3143 ; CHECK:       [[EXIT_SPLIT]]:
   3144 ; CHECK-NEXT:    %[[EXIT_PHI1:.*]] = phi i32 [ %[[LCSSA_C]], %[[LOOP_EXIT_C]] ], [ %[[LCSSA_B]], %[[LOOP_EXIT_B]] ]
   3145 ; CHECK-NEXT:    br label %exit
   3146 
   3147 ; CHECK:       exit:
   3148 ; CHECK-NEXT:    %[[EXIT_PHI2:.*]] = phi i32 [ %[[EXIT_PHI1]], %[[EXIT_SPLIT]] ], [ %[[LCSSA_A]], %[[LOOP_EXIT_A]] ]
   3149 ; CHECK-NEXT:    ret i32 %[[EXIT_PHI2]]
   3150 }
   3151 
   3152 ; Similar to @test28 but designed to have one of the duplicate edges be
   3153 ; a loop exit edge as those can in some cases be special. Among other things,
   3154 ; this includes an LCSSA phi with multiple entries despite being a dedicated
   3155 ; exit block.
   3156 define i32 @test29(i32 %arg) {
   3157 ; CHECK-LABEL: define i32 @test29(
   3158 entry:
   3159   br label %header
   3160 ; CHECK-NEXT:  entry:
   3161 ; CHECK-NEXT:    switch i32 %arg, label %[[ENTRY_SPLIT_EXIT:.*]] [
   3162 ; CHECK-NEXT:      i32 -1, label %[[ENTRY_SPLIT_EXIT]]
   3163 ; CHECK-NEXT:      i32 0, label %[[ENTRY_SPLIT_A:.*]]
   3164 ; CHECK-NEXT:      i32 1, label %[[ENTRY_SPLIT_B:.*]]
   3165 ; CHECK-NEXT:      i32 2, label %[[ENTRY_SPLIT_B]]
   3166 ; CHECK-NEXT:    ]
   3167 
   3168 header:
   3169   %tmp = call i32 @d()
   3170   %cmp1 = icmp eq i32 %tmp, 0
   3171   br i1 %cmp1, label %body.a, label %dispatch
   3172 
   3173 dispatch:
   3174   switch i32 %arg, label %loop.exit1 [
   3175     i32 -1, label %loop.exit1
   3176     i32 0, label %body.a
   3177     i32 1, label %body.b
   3178     i32 2, label %body.b
   3179   ]
   3180 
   3181 body.a:
   3182   %tmp.a.phi = phi i32 [ 0, %header ], [ %tmp, %dispatch ]
   3183   %tmp.a = call i32 @a()
   3184   %tmp.a.sum = add i32 %tmp.a.phi, %tmp.a
   3185   br label %body.b
   3186 ; Unswitched 'a' loop.
   3187 ;
   3188 ; CHECK:       [[ENTRY_SPLIT_A]]:
   3189 ; CHECK-NEXT:    br label %[[HEADER_A:.*]]
   3190 ;
   3191 ; CHECK:       [[HEADER_A]]:
   3192 ; CHECK-NEXT:    %[[TMP_A:.*]] = call i32 @d()
   3193 ; CHECK-NEXT:    %[[CMP1_A:.*]] = icmp eq i32 %[[TMP_A]], 0
   3194 ; CHECK-NEXT:    br i1 %[[CMP1_A]], label %[[BODY_A_A:.*]], label %[[DISPATCH_A:.*]]
   3195 ;
   3196 ; CHECK:       [[DISPATCH_A]]:
   3197 ; CHECK-NEXT:    br label %[[BODY_A_A]]
   3198 ;
   3199 ; CHECK:       [[BODY_A_A]]:
   3200 ; CHECK-NEXT:    %[[TMP_A_PHI_A:.*]] = phi i32 [ 0, %[[HEADER_A]] ], [ %[[TMP_A]], %[[DISPATCH_A]] ]
   3201 ; CHECK-NEXT:    %[[TMP_A_A:.*]] = call i32 @a()
   3202 ; CHECK-NEXT:    %[[TMP_A_SUM_A:.*]] = add i32 %[[TMP_A_PHI_A]], %[[TMP_A_A]]
   3203 ; CHECK-NEXT:    br label %[[BODY_B_A:.*]]
   3204 ;
   3205 ; CHECK:       [[BODY_B_A]]:
   3206 ; CHECK-NEXT:    %[[TMP_B_PHI_A:.*]] = phi i32 [ %[[TMP_A_SUM_A]], %[[BODY_A_A]] ]
   3207 ; CHECK-NEXT:    %[[TMP_B_A:.*]] = call i32 @b()
   3208 ; CHECK-NEXT:    %[[TMP_B_SUM_A:.*]] = add i32 %[[TMP_B_PHI_A]], %[[TMP_B_A]]
   3209 ; CHECK-NEXT:    br label %[[LATCH_A:.*]]
   3210 ;
   3211 ; CHECK:       [[LATCH_A]]:
   3212 ; CHECK-NEXT:    %[[CMP2_A:.*]] = icmp slt i32 %[[TMP_B_SUM_A]], 42
   3213 ; CHECK:         br i1 %[[CMP2_A]], label %[[HEADER_A]], label %[[LOOP_EXIT_A:.*]]
   3214 ;
   3215 ; CHECK:       [[LOOP_EXIT_A]]:
   3216 ; CHECK-NEXT:    %[[LCSSA_A:.*]] = phi i32 [ %[[TMP_B_SUM_A]], %[[LATCH_A]] ]
   3217 ; CHECK-NEXT:    br label %loop.exit2
   3218 
   3219 body.b:
   3220   %tmp.b.phi = phi i32 [ %tmp, %dispatch ], [ %tmp, %dispatch ], [ %tmp.a.sum, %body.a ]
   3221   %tmp.b = call i32 @b()
   3222   %tmp.b.sum = add i32 %tmp.b.phi, %tmp.b
   3223   br label %latch
   3224 ; Unswitched 'b' loop.
   3225 ;
   3226 ; CHECK:       [[ENTRY_SPLIT_B]]:
   3227 ; CHECK-NEXT:    br label %[[HEADER_B:.*]]
   3228 ;
   3229 ; CHECK:       [[HEADER_B]]:
   3230 ; CHECK-NEXT:    %[[TMP_B:.*]] = call i32 @d()
   3231 ; CHECK-NEXT:    %[[CMP1_B:.*]] = icmp eq i32 %[[TMP_B]], 0
   3232 ; CHECK-NEXT:    br i1 %[[CMP1_B]], label %[[BODY_A_B:.*]], label %[[DISPATCH_B:.*]]
   3233 ;
   3234 ; CHECK:       [[DISPATCH_B]]:
   3235 ; CHECK-NEXT:    br label %[[BODY_B_B]]
   3236 ;
   3237 ; CHECK:       [[BODY_A_B]]:
   3238 ; CHECK-NEXT:    %[[TMP_A_PHI_B:.*]] = phi i32 [ 0, %[[HEADER_B]] ]
   3239 ; CHECK-NEXT:    %[[TMP_A_B:.*]] = call i32 @a()
   3240 ; CHECK-NEXT:    %[[TMP_A_SUM_B:.*]] = add i32 %[[TMP_A_PHI_B]], %[[TMP_A_B]]
   3241 ; CHECK-NEXT:    br label %[[BODY_B_B:.*]]
   3242 ;
   3243 ; CHECK:       [[BODY_B_B]]:
   3244 ; CHECK-NEXT:    %[[TMP_B_PHI_B:.*]] = phi i32 [ %[[TMP_B]], %[[DISPATCH_B]] ], [ %[[TMP_A_SUM_B]], %[[BODY_A_B]] ]
   3245 ; CHECK-NEXT:    %[[TMP_B_B:.*]] = call i32 @b()
   3246 ; CHECK-NEXT:    %[[TMP_B_SUM_B:.*]] = add i32 %[[TMP_B_PHI_B]], %[[TMP_B_B]]
   3247 ; CHECK-NEXT:    br label %[[LATCH_B:.*]]
   3248 ;
   3249 ; CHECK:       [[LATCH_B]]:
   3250 ; CHECK-NEXT:    %[[CMP2_B:.*]] = icmp slt i32 %[[TMP_B_SUM_B]], 42
   3251 ; CHECK:         br i1 %[[CMP2_B]], label %[[HEADER_B]], label %[[LOOP_EXIT_B:.*]]
   3252 ;
   3253 ; CHECK:       [[LOOP_EXIT_B]]:
   3254 ; CHECK-NEXT:    %[[LCSSA_B:.*]] = phi i32 [ %[[TMP_B_SUM_B]], %[[LATCH_B]] ]
   3255 ; CHECK-NEXT:    br label %[[LOOP_EXIT2_SPLIT:.*]]
   3256 
   3257 latch:
   3258   %cmp2 = icmp slt i32 %tmp.b.sum, 42
   3259   br i1 %cmp2, label %header, label %loop.exit2
   3260 
   3261 loop.exit1:
   3262   %l1.phi = phi i32 [ %tmp, %dispatch ], [ %tmp, %dispatch ]
   3263   br label %exit
   3264 ; Unswitched 'exit' loop.
   3265 ;
   3266 ; CHECK:       [[ENTRY_SPLIT_EXIT]]:
   3267 ; CHECK-NEXT:    br label %[[HEADER_EXIT:.*]]
   3268 ;
   3269 ; CHECK:       [[HEADER_EXIT]]:
   3270 ; CHECK-NEXT:    %[[TMP_EXIT:.*]] = call i32 @d()
   3271 ; CHECK-NEXT:    %[[CMP1_EXIT:.*]] = icmp eq i32 %[[TMP_EXIT]], 0
   3272 ; CHECK-NEXT:    br i1 %[[CMP1_EXIT]], label %[[BODY_A_EXIT:.*]], label %[[DISPATCH_EXIT:.*]]
   3273 ;
   3274 ; CHECK:       [[DISPATCH_EXIT]]:
   3275 ; CHECK-NEXT:    %[[TMP_LCSSA:.*]] = phi i32 [ %[[TMP_EXIT]], %[[HEADER_EXIT]] ]
   3276 ; CHECK-NEXT:    br label %loop.exit1
   3277 ;
   3278 ; CHECK:       [[BODY_A_EXIT]]:
   3279 ; CHECK-NEXT:    %[[TMP_A_PHI_EXIT:.*]] = phi i32 [ 0, %[[HEADER_EXIT]] ]
   3280 ; CHECK-NEXT:    %[[TMP_A_EXIT:.*]] = call i32 @a()
   3281 ; CHECK-NEXT:    %[[TMP_A_SUM_EXIT:.*]] = add i32 %[[TMP_A_PHI_EXIT]], %[[TMP_A_EXIT]]
   3282 ; CHECK-NEXT:    br label %[[BODY_B_EXIT:.*]]
   3283 ;
   3284 ; CHECK:       [[BODY_B_EXIT]]:
   3285 ; CHECK-NEXT:    %[[TMP_B_PHI_EXIT:.*]] = phi i32 [ %[[TMP_A_SUM_EXIT]], %[[BODY_A_EXIT]] ]
   3286 ; CHECK-NEXT:    %[[TMP_B_EXIT:.*]] = call i32 @b()
   3287 ; CHECK-NEXT:    %[[TMP_B_SUM_EXIT:.*]] = add i32 %[[TMP_B_PHI_EXIT]], %[[TMP_B_EXIT]]
   3288 ; CHECK-NEXT:    br label %[[LATCH_EXIT:.*]]
   3289 ;
   3290 ; CHECK:       [[LATCH_EXIT]]:
   3291 ; CHECK-NEXT:    %[[CMP2_EXIT:.*]] = icmp slt i32 %[[TMP_B_SUM_EXIT]], 42
   3292 ; CHECK:         br i1 %[[CMP2_EXIT]], label %[[HEADER_EXIT]], label %[[LOOP_EXIT_EXIT:.*]]
   3293 ;
   3294 ; CHECK:       loop.exit1:
   3295 ; CHECK-NEXT:    %[[L1_PHI:.*]] = phi i32 [ %[[TMP_LCSSA]], %[[DISPATCH_EXIT]] ]
   3296 ; CHECK-NEXT:    br label %exit
   3297 ;
   3298 ; CHECK:       [[LOOP_EXIT_EXIT]]:
   3299 ; CHECK-NEXT:    %[[L2_PHI:.*]] = phi i32 [ %[[TMP_B_SUM_EXIT]], %[[LATCH_EXIT]] ]
   3300 ; CHECK-NEXT:    br label %[[LOOP_EXIT2_SPLIT]]
   3301 
   3302 loop.exit2:
   3303   %l2.phi = phi i32 [ %tmp.b.sum, %latch ]
   3304   br label %exit
   3305 ; CHECK:       [[LOOP_EXIT2_SPLIT]]:
   3306 ; CHECK-NEXT:    %[[LOOP_EXIT_PHI1:.*]] = phi i32 [ %[[L2_PHI]], %[[LOOP_EXIT_EXIT]] ], [ %[[LCSSA_B]], %[[LOOP_EXIT_B]] ]
   3307 ; CHECK-NEXT:    br label %loop.exit2
   3308 ;
   3309 ; CHECK:       loop.exit2:
   3310 ; CHECK-NEXT:    %[[LOOP_EXIT_PHI2:.*]] = phi i32 [ %[[LOOP_EXIT_PHI1]], %[[LOOP_EXIT2_SPLIT]] ], [ %[[LCSSA_A]], %[[LOOP_EXIT_A]] ]
   3311 ; CHECK-NEXT:    br label %exit
   3312 
   3313 exit:
   3314   %l.phi = phi i32 [ %l1.phi, %loop.exit1 ], [ %l2.phi, %loop.exit2 ]
   3315   ret i32 %l.phi
   3316 ; CHECK:       exit:
   3317 ; CHECK-NEXT:    %[[EXIT_PHI:.*]] = phi i32 [ %[[L1_PHI]], %loop.exit1 ], [ %[[LOOP_EXIT_PHI2]], %loop.exit2 ]
   3318 ; CHECK-NEXT:    ret i32 %[[EXIT_PHI]]
   3319 }
   3320 
   3321 ; Unswitch will not actually change the loop nest from:
   3322 ;   A < B < C
   3323 define void @hoist_inner_loop0() {
   3324 ; CHECK-LABEL: define void @hoist_inner_loop0(
   3325 entry:
   3326   br label %a.header
   3327 ; CHECK:       entry:
   3328 ; CHECK-NEXT:    br label %a.header
   3329 
   3330 a.header:
   3331   br label %b.header
   3332 ; CHECK:       a.header:
   3333 ; CHECK-NEXT:    br label %b.header
   3334 
   3335 b.header:
   3336   %v1 = call i1 @cond()
   3337   br label %c.header
   3338 ; CHECK:       b.header:
   3339 ; CHECK-NEXT:    %v1 = call i1 @cond()
   3340 ; CHECK-NEXT:    br i1 %v1, label %[[B_HEADER_SPLIT_US:.*]], label %[[B_HEADER_SPLIT:.*]]
   3341 ;
   3342 ; CHECK:       [[B_HEADER_SPLIT_US]]:
   3343 ; CHECK-NEXT:    br label %[[C_HEADER_US:.*]]
   3344 ;
   3345 ; CHECK:       [[C_HEADER_US]]:
   3346 ; CHECK-NEXT:    call i32 @c()
   3347 ; CHECK-NEXT:    br label %[[B_LATCH_SPLIT_US:.*]]
   3348 ;
   3349 ; CHECK:       [[B_LATCH_SPLIT_US]]:
   3350 ; CHECK-NEXT:    br label %b.latch
   3351 ;
   3352 ; CHECK:       [[B_HEADER_SPLIT]]:
   3353 ; CHECK-NEXT:    br label %c.header
   3354 
   3355 c.header:
   3356   call i32 @c()
   3357   br i1 %v1, label %b.latch, label %c.latch
   3358 ; CHECK:       c.header:
   3359 ; CHECK-NEXT:    call i32 @c()
   3360 ; CHECK-NEXT:    br label %c.latch
   3361 
   3362 c.latch:
   3363   %v2 = call i1 @cond()
   3364   br i1 %v2, label %c.header, label %b.latch
   3365 ; CHECK:       c.latch:
   3366 ; CHECK-NEXT:    %v2 = call i1 @cond()
   3367 ; CHECK-NEXT:    br i1 %v2, label %c.header, label %[[B_LATCH_SPLIT:.*]]
   3368 
   3369 b.latch:
   3370   %v3 = call i1 @cond()
   3371   br i1 %v3, label %b.header, label %a.latch
   3372 ; CHECK:       [[B_LATCH_SPLIT]]:
   3373 ; CHECK-NEXT:    br label %b.latch
   3374 ;
   3375 ; CHECK:       b.latch:
   3376 ; CHECK-NEXT:    %v3 = call i1 @cond()
   3377 ; CHECK-NEXT:    br i1 %v3, label %b.header, label %a.latch
   3378 
   3379 a.latch:
   3380   br label %a.header
   3381 ; CHECK:       a.latch:
   3382 ; CHECK-NEXT:    br label %a.header
   3383 
   3384 exit:
   3385   ret void
   3386 ; CHECK:       exit:
   3387 ; CHECK-NEXT:    ret void
   3388 }
   3389 
   3390 ; Unswitch will transform the loop nest from:
   3391 ;   A < B < C
   3392 ; into
   3393 ;   A < (B, C)
   3394 define void @hoist_inner_loop1(i32* %ptr) {
   3395 ; CHECK-LABEL: define void @hoist_inner_loop1(
   3396 entry:
   3397   br label %a.header
   3398 ; CHECK:       entry:
   3399 ; CHECK-NEXT:    br label %a.header
   3400 
   3401 a.header:
   3402   %x.a = load i32, i32* %ptr
   3403   br label %b.header
   3404 ; CHECK:       a.header:
   3405 ; CHECK-NEXT:    %x.a = load i32, i32* %ptr
   3406 ; CHECK-NEXT:    br label %b.header
   3407 
   3408 b.header:
   3409   %x.b = load i32, i32* %ptr
   3410   %v1 = call i1 @cond()
   3411   br label %c.header
   3412 ; CHECK:       b.header:
   3413 ; CHECK-NEXT:    %x.b = load i32, i32* %ptr
   3414 ; CHECK-NEXT:    %v1 = call i1 @cond()
   3415 ; CHECK-NEXT:    br i1 %v1, label %[[B_HEADER_SPLIT_US:.*]], label %[[B_HEADER_SPLIT:.*]]
   3416 ;
   3417 ; CHECK:       [[B_HEADER_SPLIT_US]]:
   3418 ; CHECK-NEXT:    br label %[[C_HEADER_US:.*]]
   3419 ;
   3420 ; CHECK:       [[C_HEADER_US]]:
   3421 ; CHECK-NEXT:    call i32 @c()
   3422 ; CHECK-NEXT:    br label %[[B_LATCH_US:.*]]
   3423 ;
   3424 ; CHECK:       [[B_LATCH_US]]:
   3425 ; CHECK-NEXT:    br label %b.latch
   3426 ;
   3427 ; CHECK:       [[B_HEADER_SPLIT]]:
   3428 ; CHECK-NEXT:    %[[X_B_LCSSA:.*]] = phi i32 [ %x.b, %b.header ]
   3429 ; CHECK-NEXT:    br label %c.header
   3430 
   3431 c.header:
   3432   call i32 @c()
   3433   br i1 %v1, label %b.latch, label %c.latch
   3434 ; CHECK:       c.header:
   3435 ; CHECK-NEXT:    call i32 @c()
   3436 ; CHECK-NEXT:    br label %c.latch
   3437 
   3438 c.latch:
   3439   ; Use values from other loops to check LCSSA form.
   3440   store i32 %x.a, i32* %ptr
   3441   store i32 %x.b, i32* %ptr
   3442   %v2 = call i1 @cond()
   3443   br i1 %v2, label %c.header, label %a.exit.c
   3444 ; CHECK:       c.latch:
   3445 ; CHECK-NEXT:    store i32 %x.a, i32* %ptr
   3446 ; CHECK-NEXT:    store i32 %[[X_B_LCSSA]], i32* %ptr
   3447 ; CHECK-NEXT:    %v2 = call i1 @cond()
   3448 ; CHECK-NEXT:    br i1 %v2, label %c.header, label %a.exit.c
   3449 
   3450 b.latch:
   3451   %v3 = call i1 @cond()
   3452   br i1 %v3, label %b.header, label %a.exit.b
   3453 ; CHECK:       b.latch:
   3454 ; CHECK-NEXT:    %v3 = call i1 @cond()
   3455 ; CHECK-NEXT:    br i1 %v3, label %b.header, label %a.exit.b
   3456 
   3457 a.exit.c:
   3458   br label %a.latch
   3459 ; CHECK:       a.exit.c
   3460 ; CHECK-NEXT:    br label %a.latch
   3461 
   3462 a.exit.b:
   3463   br label %a.latch
   3464 ; CHECK:       a.exit.b:
   3465 ; CHECK-NEXT:    br label %a.latch
   3466 
   3467 a.latch:
   3468   br label %a.header
   3469 ; CHECK:       a.latch:
   3470 ; CHECK-NEXT:    br label %a.header
   3471 
   3472 exit:
   3473   ret void
   3474 ; CHECK:       exit:
   3475 ; CHECK-NEXT:    ret void
   3476 }
   3477 
   3478 ; Unswitch will transform the loop nest from:
   3479 ;   A < B < C
   3480 ; into
   3481 ;   (A < B), C
   3482 define void @hoist_inner_loop2(i32* %ptr) {
   3483 ; CHECK-LABEL: define void @hoist_inner_loop2(
   3484 entry:
   3485   br label %a.header
   3486 ; CHECK:       entry:
   3487 ; CHECK-NEXT:    br label %a.header
   3488 
   3489 a.header:
   3490   %x.a = load i32, i32* %ptr
   3491   br label %b.header
   3492 ; CHECK:       a.header:
   3493 ; CHECK-NEXT:    %x.a = load i32, i32* %ptr
   3494 ; CHECK-NEXT:    br label %b.header
   3495 
   3496 b.header:
   3497   %x.b = load i32, i32* %ptr
   3498   %v1 = call i1 @cond()
   3499   br label %c.header
   3500 ; CHECK:       b.header:
   3501 ; CHECK-NEXT:    %x.b = load i32, i32* %ptr
   3502 ; CHECK-NEXT:    %v1 = call i1 @cond()
   3503 ; CHECK-NEXT:    br i1 %v1, label %[[B_HEADER_SPLIT_US:.*]], label %[[B_HEADER_SPLIT:.*]]
   3504 ;
   3505 ; CHECK:       [[B_HEADER_SPLIT_US]]:
   3506 ; CHECK-NEXT:    br label %[[C_HEADER_US:.*]]
   3507 ;
   3508 ; CHECK:       [[C_HEADER_US]]:
   3509 ; CHECK-NEXT:    call i32 @c()
   3510 ; CHECK-NEXT:    br label %[[B_LATCH_US:.*]]
   3511 ;
   3512 ; CHECK:       [[B_LATCH_US]]:
   3513 ; CHECK-NEXT:    br label %b.latch
   3514 ;
   3515 ; CHECK:       [[B_HEADER_SPLIT]]:
   3516 ; CHECK-NEXT:    %[[X_A_LCSSA:.*]] = phi i32 [ %x.a, %b.header ]
   3517 ; CHECK-NEXT:    %[[X_B_LCSSA:.*]] = phi i32 [ %x.b, %b.header ]
   3518 ; CHECK-NEXT:    br label %c.header
   3519 
   3520 c.header:
   3521   call i32 @c()
   3522   br i1 %v1, label %b.latch, label %c.latch
   3523 ; CHECK:       c.header:
   3524 ; CHECK-NEXT:    call i32 @c()
   3525 ; CHECK-NEXT:    br label %c.latch
   3526 
   3527 c.latch:
   3528   ; Use values from other loops to check LCSSA form.
   3529   store i32 %x.a, i32* %ptr
   3530   store i32 %x.b, i32* %ptr
   3531   %v2 = call i1 @cond()
   3532   br i1 %v2, label %c.header, label %exit
   3533 ; CHECK:       c.latch:
   3534 ; CHECK-NEXT:    store i32 %[[X_A_LCSSA]], i32* %ptr
   3535 ; CHECK-NEXT:    store i32 %[[X_B_LCSSA]], i32* %ptr
   3536 ; CHECK-NEXT:    %v2 = call i1 @cond()
   3537 ; CHECK-NEXT:    br i1 %v2, label %c.header, label %exit
   3538 
   3539 b.latch:
   3540   %v3 = call i1 @cond()
   3541   br i1 %v3, label %b.header, label %a.latch
   3542 ; CHECK:       b.latch:
   3543 ; CHECK-NEXT:    %v3 = call i1 @cond()
   3544 ; CHECK-NEXT:    br i1 %v3, label %b.header, label %a.latch
   3545 
   3546 a.latch:
   3547   br label %a.header
   3548 ; CHECK:       a.latch:
   3549 ; CHECK-NEXT:    br label %a.header
   3550 
   3551 exit:
   3552   ret void
   3553 ; CHECK:       exit:
   3554 ; CHECK-NEXT:    ret void
   3555 }
   3556 
   3557 ; Same as @hoist_inner_loop2 but with a nested loop inside the hoisted loop.
   3558 ; Unswitch will transform the loop nest from:
   3559 ;   A < B < C < D
   3560 ; into
   3561 ;   (A < B), (C < D)
   3562 define void @hoist_inner_loop3(i32* %ptr) {
   3563 ; CHECK-LABEL: define void @hoist_inner_loop3(
   3564 entry:
   3565   br label %a.header
   3566 ; CHECK:       entry:
   3567 ; CHECK-NEXT:    br label %a.header
   3568 
   3569 a.header:
   3570   %x.a = load i32, i32* %ptr
   3571   br label %b.header
   3572 ; CHECK:       a.header:
   3573 ; CHECK-NEXT:    %x.a = load i32, i32* %ptr
   3574 ; CHECK-NEXT:    br label %b.header
   3575 
   3576 b.header:
   3577   %x.b = load i32, i32* %ptr
   3578   %v1 = call i1 @cond()
   3579   br label %c.header
   3580 ; CHECK:       b.header:
   3581 ; CHECK-NEXT:    %x.b = load i32, i32* %ptr
   3582 ; CHECK-NEXT:    %v1 = call i1 @cond()
   3583 ; CHECK-NEXT:    br i1 %v1, label %[[B_HEADER_SPLIT_US:.*]], label %[[B_HEADER_SPLIT:.*]]
   3584 ;
   3585 ; CHECK:       [[B_HEADER_SPLIT_US]]:
   3586 ; CHECK-NEXT:    br label %[[C_HEADER_US:.*]]
   3587 ;
   3588 ; CHECK:       [[C_HEADER_US]]:
   3589 ; CHECK-NEXT:    call i32 @c()
   3590 ; CHECK-NEXT:    br label %[[B_LATCH_US:.*]]
   3591 ;
   3592 ; CHECK:       [[B_LATCH_US]]:
   3593 ; CHECK-NEXT:    br label %b.latch
   3594 ;
   3595 ; CHECK:       [[B_HEADER_SPLIT]]:
   3596 ; CHECK-NEXT:    %[[X_A_LCSSA:.*]] = phi i32 [ %x.a, %b.header ]
   3597 ; CHECK-NEXT:    %[[X_B_LCSSA:.*]] = phi i32 [ %x.b, %b.header ]
   3598 ; CHECK-NEXT:    br label %c.header
   3599 
   3600 c.header:
   3601   call i32 @c()
   3602   br i1 %v1, label %b.latch, label %c.body
   3603 ; CHECK:       c.header:
   3604 ; CHECK-NEXT:    call i32 @c()
   3605 ; CHECK-NEXT:    br label %c.body
   3606 
   3607 c.body:
   3608   %x.c = load i32, i32* %ptr
   3609   br label %d.header
   3610 ; CHECK:       c.body:
   3611 ; CHECK-NEXT:    %x.c = load i32, i32* %ptr
   3612 ; CHECK-NEXT:    br label %d.header
   3613 
   3614 d.header:
   3615   ; Use values from other loops to check LCSSA form.
   3616   store i32 %x.a, i32* %ptr
   3617   store i32 %x.b, i32* %ptr
   3618   store i32 %x.c, i32* %ptr
   3619   %v2 = call i1 @cond()
   3620   br i1 %v2, label %d.header, label %c.latch
   3621 ; CHECK:       d.header:
   3622 ; CHECK-NEXT:    store i32 %[[X_A_LCSSA]], i32* %ptr
   3623 ; CHECK-NEXT:    store i32 %[[X_B_LCSSA]], i32* %ptr
   3624 ; CHECK-NEXT:    store i32 %x.c, i32* %ptr
   3625 ; CHECK-NEXT:    %v2 = call i1 @cond()
   3626 ; CHECK-NEXT:    br i1 %v2, label %d.header, label %c.latch
   3627 
   3628 c.latch:
   3629   %v3 = call i1 @cond()
   3630   br i1 %v3, label %c.header, label %exit
   3631 ; CHECK:       c.latch:
   3632 ; CHECK-NEXT:    %v3 = call i1 @cond()
   3633 ; CHECK-NEXT:    br i1 %v3, label %c.header, label %exit
   3634 
   3635 b.latch:
   3636   %v4 = call i1 @cond()
   3637   br i1 %v4, label %b.header, label %a.latch
   3638 ; CHECK:       b.latch:
   3639 ; CHECK-NEXT:    %v4 = call i1 @cond()
   3640 ; CHECK-NEXT:    br i1 %v4, label %b.header, label %a.latch
   3641 
   3642 a.latch:
   3643   br label %a.header
   3644 ; CHECK:       a.latch:
   3645 ; CHECK-NEXT:    br label %a.header
   3646 
   3647 exit:
   3648   ret void
   3649 ; CHECK:       exit:
   3650 ; CHECK-NEXT:    ret void
   3651 }
   3652 
   3653 ; This test is designed to exercise checking multiple remaining exits from the
   3654 ; loop being unswitched.
   3655 ; Unswitch will transform the loop nest from:
   3656 ;   A < B < C < D
   3657 ; into
   3658 ;   A < B < (C, D)
   3659 define void @hoist_inner_loop4() {
   3660 ; CHECK-LABEL: define void @hoist_inner_loop4(
   3661 entry:
   3662   br label %a.header
   3663 ; CHECK:       entry:
   3664 ; CHECK-NEXT:    br label %a.header
   3665 
   3666 a.header:
   3667   br label %b.header
   3668 ; CHECK:       a.header:
   3669 ; CHECK-NEXT:    br label %b.header
   3670 
   3671 b.header:
   3672   br label %c.header
   3673 ; CHECK:       b.header:
   3674 ; CHECK-NEXT:    br label %c.header
   3675 
   3676 c.header:
   3677   %v1 = call i1 @cond()
   3678   br label %d.header
   3679 ; CHECK:       c.header:
   3680 ; CHECK-NEXT:    %v1 = call i1 @cond()
   3681 ; CHECK-NEXT:    br i1 %v1, label %[[C_HEADER_SPLIT_US:.*]], label %[[C_HEADER_SPLIT:.*]]
   3682 ;
   3683 ; CHECK:       [[C_HEADER_SPLIT_US]]:
   3684 ; CHECK-NEXT:    br label %[[D_HEADER_US:.*]]
   3685 ;
   3686 ; CHECK:       [[D_HEADER_US]]:
   3687 ; CHECK-NEXT:    call i32 @d()
   3688 ; CHECK-NEXT:    br label %[[C_LATCH_US:.*]]
   3689 ;
   3690 ; CHECK:       [[C_LATCH_US]]:
   3691 ; CHECK-NEXT:    br label %c.latch
   3692 ;
   3693 ; CHECK:       [[C_HEADER_SPLIT]]:
   3694 ; CHECK-NEXT:    br label %d.header
   3695 
   3696 d.header:
   3697   call i32 @d()
   3698   br i1 %v1, label %c.latch, label %d.exiting1
   3699 ; CHECK:       d.header:
   3700 ; CHECK-NEXT:    call i32 @d()
   3701 ; CHECK-NEXT:    br label %d.exiting1
   3702 
   3703 d.exiting1:
   3704   %v2 = call i1 @cond()
   3705   br i1 %v2, label %d.exiting2, label %a.latch
   3706 ; CHECK:       d.exiting1:
   3707 ; CHECK-NEXT:    %v2 = call i1 @cond()
   3708 ; CHECK-NEXT:    br i1 %v2, label %d.exiting2, label %a.latch
   3709 
   3710 d.exiting2:
   3711   %v3 = call i1 @cond()
   3712   br i1 %v3, label %d.exiting3, label %loopexit.d
   3713 ; CHECK:       d.exiting2:
   3714 ; CHECK-NEXT:    %v3 = call i1 @cond()
   3715 ; CHECK-NEXT:    br i1 %v3, label %d.exiting3, label %loopexit.d
   3716 
   3717 d.exiting3:
   3718   %v4 = call i1 @cond()
   3719   br i1 %v4, label %d.latch, label %b.latch
   3720 ; CHECK:       d.exiting3:
   3721 ; CHECK-NEXT:    %v4 = call i1 @cond()
   3722 ; CHECK-NEXT:    br i1 %v4, label %d.latch, label %b.latch
   3723 
   3724 d.latch:
   3725   br label %d.header
   3726 ; CHECK:       d.latch:
   3727 ; CHECK-NEXT:    br label %d.header
   3728 
   3729 c.latch:
   3730   %v5 = call i1 @cond()
   3731   br i1 %v5, label %c.header, label %loopexit.c
   3732 ; CHECK:       c.latch:
   3733 ; CHECK-NEXT:    %v5 = call i1 @cond()
   3734 ; CHECK-NEXT:    br i1 %v5, label %c.header, label %loopexit.c
   3735 
   3736 b.latch:
   3737   br label %b.header
   3738 ; CHECK:       b.latch:
   3739 ; CHECK-NEXT:    br label %b.header
   3740 
   3741 a.latch:
   3742   br label %a.header
   3743 ; CHECK:       a.latch:
   3744 ; CHECK-NEXT:    br label %a.header
   3745 
   3746 loopexit.d:
   3747   br label %exit
   3748 ; CHECK:       loopexit.d:
   3749 ; CHECK-NEXT:    br label %exit
   3750 
   3751 loopexit.c:
   3752   br label %exit
   3753 ; CHECK:       loopexit.c:
   3754 ; CHECK-NEXT:    br label %exit
   3755 
   3756 exit:
   3757   ret void
   3758 ; CHECK:       exit:
   3759 ; CHECK-NEXT:    ret void
   3760 }
   3761 
   3762 ; Unswitch will transform the loop nest from:
   3763 ;   A < B < C < D
   3764 ; into
   3765 ;   A < ((B < C), D)
   3766 define void @hoist_inner_loop5(i32* %ptr) {
   3767 ; CHECK-LABEL: define void @hoist_inner_loop5(
   3768 entry:
   3769   br label %a.header
   3770 ; CHECK:       entry:
   3771 ; CHECK-NEXT:    br label %a.header
   3772 
   3773 a.header:
   3774   %x.a = load i32, i32* %ptr
   3775   br label %b.header
   3776 ; CHECK:       a.header:
   3777 ; CHECK-NEXT:    %x.a = load i32, i32* %ptr
   3778 ; CHECK-NEXT:    br label %b.header
   3779 
   3780 b.header:
   3781   %x.b = load i32, i32* %ptr
   3782   br label %c.header
   3783 ; CHECK:       b.header:
   3784 ; CHECK-NEXT:    %x.b = load i32, i32* %ptr
   3785 ; CHECK-NEXT:    br label %c.header
   3786 
   3787 c.header:
   3788   %x.c = load i32, i32* %ptr
   3789   %v1 = call i1 @cond()
   3790   br label %d.header
   3791 ; CHECK:       c.header:
   3792 ; CHECK-NEXT:    %x.c = load i32, i32* %ptr
   3793 ; CHECK-NEXT:    %v1 = call i1 @cond()
   3794 ; CHECK-NEXT:    br i1 %v1, label %[[C_HEADER_SPLIT_US:.*]], label %[[C_HEADER_SPLIT:.*]]
   3795 ;
   3796 ; CHECK:       [[C_HEADER_SPLIT_US]]:
   3797 ; CHECK-NEXT:    br label %[[D_HEADER_US:.*]]
   3798 ;
   3799 ; CHECK:       [[D_HEADER_US]]:
   3800 ; CHECK-NEXT:    call i32 @d()
   3801 ; CHECK-NEXT:    br label %[[C_LATCH_US:.*]]
   3802 ;
   3803 ; CHECK:       [[C_LATCH_US]]:
   3804 ; CHECK-NEXT:    br label %c.latch
   3805 ;
   3806 ; CHECK:       [[C_HEADER_SPLIT]]:
   3807 ; CHECK-NEXT:    %[[X_B_LCSSA:.*]] = phi i32 [ %x.b, %c.header ]
   3808 ; CHECK-NEXT:    %[[X_C_LCSSA:.*]] = phi i32 [ %x.c, %c.header ]
   3809 ; CHECK-NEXT:    br label %d.header
   3810 
   3811 d.header:
   3812   call i32 @d()
   3813   br i1 %v1, label %c.latch, label %d.latch
   3814 ; CHECK:       d.header:
   3815 ; CHECK-NEXT:    call i32 @d()
   3816 ; CHECK-NEXT:    br label %d.latch
   3817 
   3818 d.latch:
   3819   ; Use values from other loops to check LCSSA form.
   3820   store i32 %x.a, i32* %ptr
   3821   store i32 %x.b, i32* %ptr
   3822   store i32 %x.c, i32* %ptr
   3823   %v2 = call i1 @cond()
   3824   br i1 %v2, label %d.header, label %a.latch
   3825 ; CHECK:       d.latch:
   3826 ; CHECK-NEXT:    store i32 %x.a, i32* %ptr
   3827 ; CHECK-NEXT:    store i32 %[[X_B_LCSSA]], i32* %ptr
   3828 ; CHECK-NEXT:    store i32 %[[X_C_LCSSA]], i32* %ptr
   3829 ; CHECK-NEXT:    %v2 = call i1 @cond()
   3830 ; CHECK-NEXT:    br i1 %v2, label %d.header, label %a.latch
   3831 
   3832 c.latch:
   3833   %v3 = call i1 @cond()
   3834   br i1 %v3, label %c.header, label %b.latch
   3835 ; CHECK:       c.latch:
   3836 ; CHECK-NEXT:    %v3 = call i1 @cond()
   3837 ; CHECK-NEXT:    br i1 %v3, label %c.header, label %b.latch
   3838 
   3839 b.latch:
   3840   br label %b.header
   3841 ; CHECK:       b.latch:
   3842 ; CHECK-NEXT:    br label %b.header
   3843 
   3844 a.latch:
   3845   br label %a.header
   3846 ; CHECK:       a.latch:
   3847 ; CHECK-NEXT:    br label %a.header
   3848 
   3849 exit:
   3850   ret void
   3851 ; CHECK:       exit:
   3852 ; CHECK-NEXT:    ret void
   3853 }
   3854 
   3855 define void @hoist_inner_loop_switch(i32* %ptr) {
   3856 ; CHECK-LABEL: define void @hoist_inner_loop_switch(
   3857 entry:
   3858   br label %a.header
   3859 ; CHECK:       entry:
   3860 ; CHECK-NEXT:    br label %a.header
   3861 
   3862 a.header:
   3863   %x.a = load i32, i32* %ptr
   3864   br label %b.header
   3865 ; CHECK:       a.header:
   3866 ; CHECK-NEXT:    %x.a = load i32, i32* %ptr
   3867 ; CHECK-NEXT:    br label %b.header
   3868 
   3869 b.header:
   3870   %x.b = load i32, i32* %ptr
   3871   %v1 = call i32 @cond.i32()
   3872   br label %c.header
   3873 ; CHECK:       b.header:
   3874 ; CHECK-NEXT:    %x.b = load i32, i32* %ptr
   3875 ; CHECK-NEXT:    %v1 = call i32 @cond.i32()
   3876 ; CHECK-NEXT:    switch i32 %v1, label %[[B_HEADER_SPLIT:.*]] [
   3877 ; CHECK-NEXT:      i32 1, label %[[B_HEADER_SPLIT_US:.*]]
   3878 ; CHECK-NEXT:      i32 2, label %[[B_HEADER_SPLIT_US]]
   3879 ; CHECK-NEXT:      i32 3, label %[[B_HEADER_SPLIT_US]]
   3880 ; CHECK-NEXT:    ]
   3881 ;
   3882 ; CHECK:       [[B_HEADER_SPLIT_US]]:
   3883 ; CHECK-NEXT:    br label %[[C_HEADER_US:.*]]
   3884 ;
   3885 ; CHECK:       [[C_HEADER_US]]:
   3886 ; CHECK-NEXT:    call i32 @c()
   3887 ; CHECK-NEXT:    br label %[[B_LATCH_US:.*]]
   3888 ;
   3889 ; CHECK:       [[B_LATCH_US]]:
   3890 ; CHECK-NEXT:    br label %b.latch
   3891 ;
   3892 ; CHECK:       [[B_HEADER_SPLIT]]:
   3893 ; CHECK-NEXT:    %[[X_A_LCSSA:.*]] = phi i32 [ %x.a, %b.header ]
   3894 ; CHECK-NEXT:    %[[X_B_LCSSA:.*]] = phi i32 [ %x.b, %b.header ]
   3895 ; CHECK-NEXT:    br label %c.header
   3896 
   3897 c.header:
   3898   call i32 @c()
   3899   switch i32 %v1, label %c.latch [
   3900     i32 1, label %b.latch
   3901     i32 2, label %b.latch
   3902     i32 3, label %b.latch
   3903   ]
   3904 ; CHECK:       c.header:
   3905 ; CHECK-NEXT:    call i32 @c()
   3906 ; CHECK-NEXT:    br label %c.latch
   3907 
   3908 c.latch:
   3909   ; Use values from other loops to check LCSSA form.
   3910   store i32 %x.a, i32* %ptr
   3911   store i32 %x.b, i32* %ptr
   3912   %v2 = call i1 @cond()
   3913   br i1 %v2, label %c.header, label %exit
   3914 ; CHECK:       c.latch:
   3915 ; CHECK-NEXT:    store i32 %[[X_A_LCSSA]], i32* %ptr
   3916 ; CHECK-NEXT:    store i32 %[[X_B_LCSSA]], i32* %ptr
   3917 ; CHECK-NEXT:    %v2 = call i1 @cond()
   3918 ; CHECK-NEXT:    br i1 %v2, label %c.header, label %exit
   3919 
   3920 b.latch:
   3921   %v3 = call i1 @cond()
   3922   br i1 %v3, label %b.header, label %a.latch
   3923 ; CHECK:       b.latch:
   3924 ; CHECK-NEXT:    %v3 = call i1 @cond()
   3925 ; CHECK-NEXT:    br i1 %v3, label %b.header, label %a.latch
   3926 
   3927 a.latch:
   3928   br label %a.header
   3929 ; CHECK:       a.latch:
   3930 ; CHECK-NEXT:    br label %a.header
   3931 
   3932 exit:
   3933   ret void
   3934 ; CHECK:       exit:
   3935 ; CHECK-NEXT:    ret void
   3936 }
   3937 
   3938 ; A devilish pattern. This is a crafty, crafty test case designed to risk
   3939 ; creating indirect cycles with trivial and non-trivial unswitching. The inner
   3940 ; loop has a switch with a trivial exit edge that can be unswitched, but the
   3941 ; rest of the switch cannot be unswitched because its cost is too high.
   3942 ; However, the unswitching of the trivial edge creates a new switch in the
   3943 ; outer loop. *This* switch isn't trivial, but has a low cost to unswitch. When
   3944 ; we unswitch this switch from the outer loop, we will remove it completely and
   3945 ; create a clone of the inner loop on one side. This clone will then again be
   3946 ; viable for unswitching the inner-most loop. This lets us check that the
   3947 ; unswitching doesn't end up cycling infinitely even when the cycle is
   3948 ; indirect and due to revisiting a loop after cloning.
   3949 define void @test30(i32 %arg) {
   3950 ; CHECK-LABEL: define void @test30(
   3951 entry:
   3952   br label %outer.header
   3953 ; CHECK-NEXT:  entry:
   3954 ; CHECK-NEXT:    switch i32 %arg, label %[[ENTRY_SPLIT:.*]] [
   3955 ; CHECK-NEXT:      i32 1, label %[[ENTRY_SPLIT_US:.*]]
   3956 ; CHECK-NEXT:      i32 2, label %[[ENTRY_SPLIT_US]]
   3957 ; CHECK-NEXT:    ]
   3958 ;
   3959 ; CHECK:       [[ENTRY_SPLIT_US]]:
   3960 ; CHECK-NEXT:    switch i32 %arg, label %[[ENTRY_SPLIT_US_SPLIT:.*]] [
   3961 ; CHECK-NEXT:      i32 1, label %[[ENTRY_SPLIT_US_SPLIT_US:.*]]
   3962 ; CHECK-NEXT:    ]
   3963 
   3964 outer.header:
   3965   br label %inner.header
   3966 
   3967 inner.header:
   3968   switch i32 %arg, label %inner.loopexit1 [
   3969     i32 1, label %inner.body1
   3970     i32 2, label %inner.body2
   3971   ]
   3972 
   3973 inner.body1:
   3974   %a = call i32 @a()
   3975   br label %inner.latch
   3976 ; The (super convoluted) fully unswitched loop around `@a`.
   3977 ;
   3978 ; CHECK:       [[ENTRY_SPLIT_US_SPLIT_US]]:
   3979 ; CHECK-NEXT:    br label %[[OUTER_HEADER_US_US:.*]]
   3980 ;
   3981 ; CHECK:       [[OUTER_HEADER_US_US]]:
   3982 ; CHECK-NEXT:    br label %[[OUTER_HEADER_SPLIT_US_US:.*]]
   3983 ;
   3984 ; CHECK:       [[OUTER_LATCH_US_US:.*]]:
   3985 ; CHECK-NEXT:    %[[OUTER_COND_US_US:.*]] = call i1 @cond()
   3986 ; CHECK-NEXT:    br i1 %[[OUTER_COND_US_US]], label %[[OUTER_HEADER_US_US]], label %[[EXIT_SPLIT_US_SPLIT_US:.*]]
   3987 ;
   3988 ; CHECK:       [[OUTER_HEADER_SPLIT_US_US]]:
   3989 ; CHECK-NEXT:    br label %[[OUTER_HEADER_SPLIT_SPLIT_US_US_US:.*]]
   3990 ;
   3991 ; CHECK:       [[INNER_LOOPEXIT2_US_US:.*]]:
   3992 ; CHECK-NEXT:    br label %[[OUTER_LATCH_US_US]]
   3993 ;
   3994 ; CHECK:       [[OUTER_HEADER_SPLIT_SPLIT_US_US_US]]:
   3995 ; CHECK-NEXT:    br label %[[INNER_HEADER_US_US_US:.*]]
   3996 ;
   3997 ; CHECK:       [[INNER_HEADER_US_US_US]]:
   3998 ; CHECK-NEXT:    br label %[[INNER_BODY1_US_US_US:.*]]
   3999 ;
   4000 ; CHECK:       [[INNER_BODY1_US_US_US]]:
   4001 ; CHECK-NEXT:    %[[A:.*]] = call i32 @a()
   4002 ; CHECK-NEXT:    br label %[[INNER_LATCH_US_US_US:.*]]
   4003 ;
   4004 ; CHECK:       [[INNER_LATCH_US_US_US]]:
   4005 ; CHECK-NEXT:    %[[PHI_A:.*]] = phi i32 [ %[[A]], %[[INNER_BODY1_US_US_US]] ]
   4006 ; CHECK-NEXT:    call void @sink1(i32 0)
   4007 ; CHECK-NEXT:    call void @sink1(i32 0)
   4008 ; CHECK-NEXT:    call void @sink1(i32 0)
   4009 ; CHECK-NEXT:    call void @sink1(i32 0)
   4010 ; CHECK-NEXT:    call void @sink1(i32 0)
   4011 ; CHECK-NEXT:    call void @sink1(i32 0)
   4012 ; CHECK-NEXT:    call void @sink1(i32 0)
   4013 ; CHECK-NEXT:    call void @sink1(i32 0)
   4014 ; CHECK-NEXT:    call void @sink1(i32 0)
   4015 ; CHECK-NEXT:    call void @sink1(i32 0)
   4016 ; CHECK-NEXT:    call void @sink1(i32 %[[PHI_A]])
   4017 ; CHECK-NEXT:    %[[INNER_COND_US_US_US:.*]] = call i1 @cond()
   4018 ; CHECK-NEXT:    br i1 %[[INNER_COND_US_US_US]], label %[[INNER_HEADER_US_US_US]], label %[[INNER_LOOPEXIT2_SPLIT_US_US_US:.*]]
   4019 ;
   4020 ; CHECK:       [[INNER_LOOPEXIT2_SPLIT_US_US_US]]:
   4021 ; CHECK-NEXT:    br label %[[INNER_LOOPEXIT2_US_US]]
   4022 ;
   4023 ; CHECK:       [[EXIT_SPLIT_US_SPLIT_US]]:
   4024 ; CHECK-NEXT:    br label %[[EXIT_SPLIT_US:.*]]
   4025 
   4026 
   4027 inner.body2:
   4028   %b = call i32 @b()
   4029   br label %inner.latch
   4030 ; The fully unswitched loop around `@b`.
   4031 ;
   4032 ; CHECK:       [[ENTRY_SPLIT_US_SPLIT]]:
   4033 ; CHECK-NEXT:    br label %[[OUTER_HEADER_US:.*]]
   4034 ;
   4035 ; CHECK:       [[OUTER_HEADER_US]]:
   4036 ; CHECK-NEXT:    br label %[[OUTER_HEADER_SPLIT_US:.*]]
   4037 ;
   4038 ; CHECK:       [[INNER_HEADER_US:.*]]:
   4039 ; CHECK-NEXT:    br label %[[INNER_BODY2_US:.*]]
   4040 ;
   4041 ; CHECK:       [[INNER_BODY2_US]]:
   4042 ; CHECK-NEXT:    %[[B:.*]] = call i32 @b()
   4043 ; CHECK-NEXT:    br label %[[INNER_LATCH_US:.*]]
   4044 ;
   4045 ; CHECK:       [[INNER_LATCH_US]]:
   4046 ; CHECK-NEXT:    call void @sink1(i32 0)
   4047 ; CHECK-NEXT:    call void @sink1(i32 0)
   4048 ; CHECK-NEXT:    call void @sink1(i32 0)
   4049 ; CHECK-NEXT:    call void @sink1(i32 0)
   4050 ; CHECK-NEXT:    call void @sink1(i32 0)
   4051 ; CHECK-NEXT:    call void @sink1(i32 0)
   4052 ; CHECK-NEXT:    call void @sink1(i32 0)
   4053 ; CHECK-NEXT:    call void @sink1(i32 0)
   4054 ; CHECK-NEXT:    call void @sink1(i32 0)
   4055 ; CHECK-NEXT:    call void @sink1(i32 0)
   4056 ; CHECK-NEXT:    call void @sink1(i32 %[[B]])
   4057 ; CHECK-NEXT:    %[[INNER_COND_US:.*]] = call i1 @cond()
   4058 ; CHECK-NEXT:    br i1 %[[INNER_COND_US]], label %[[INNER_HEADER_US]], label %[[INNER_LOOPEXIT2_SPLIT_US:.*]]
   4059 ;
   4060 ; CHECK:       [[INNER_LOOPEXIT2_SPLIT_US]]:
   4061 ; CHECK-NEXT:    br label %[[INNER_LOOPEXIT2_US:.*]]
   4062 ;
   4063 ; CHECK:       [[OUTER_LATCH_US:.*]]:
   4064 ; CHECK-NEXT:    %[[OUTER_COND_US:.*]] = call i1 @cond()
   4065 ; CHECK-NEXT:    br i1 %[[OUTER_COND_US]], label %[[OUTER_HEADER_US]], label %[[EXIT_SPLIT_US_SPLIT:.*]]
   4066 ;
   4067 ; CHECK:       [[OUTER_HEADER_SPLIT_US]]:
   4068 ; CHECK-NEXT:    br label %[[OUTER_HEADER_SPLIT_SPLIT_US:.*]]
   4069 ;
   4070 ; CHECK:       [[OUTER_HEADER_SPLIT_SPLIT_US]]:
   4071 ; CHECK-NEXT:    br label %[[INNER_HEADER_US]]
   4072 ;
   4073 ; CHECK:       [[INNER_LOOPEXIT2_US]]:
   4074 ; CHECK-NEXT:    br label %[[OUTER_LATCH_US]]
   4075 ;
   4076 ; CHECK:       [[EXIT_SPLIT_US]]:
   4077 ; CHECK-NEXT:    br label %exit
   4078 
   4079 inner.latch:
   4080   %phi = phi i32 [ %a, %inner.body1 ], [ %b, %inner.body2 ]
   4081   ; Make 10 junk calls here to ensure we're over the "50" cost threshold of
   4082   ; non-trivial unswitching for this inner switch.
   4083   call void @sink1(i32 0)
   4084   call void @sink1(i32 0)
   4085   call void @sink1(i32 0)
   4086   call void @sink1(i32 0)
   4087   call void @sink1(i32 0)
   4088   call void @sink1(i32 0)
   4089   call void @sink1(i32 0)
   4090   call void @sink1(i32 0)
   4091   call void @sink1(i32 0)
   4092   call void @sink1(i32 0)
   4093   call void @sink1(i32 %phi)
   4094   %inner.cond = call i1 @cond()
   4095   br i1 %inner.cond, label %inner.header, label %inner.loopexit2
   4096 
   4097 inner.loopexit1:
   4098   br label %outer.latch
   4099 ; The unswitched `loopexit1` path.
   4100 ;
   4101 ; CHECK:       [[ENTRY_SPLIT]]:
   4102 ; CHECK-NEXT:    br label %[[OUTER_HEADER:.*]]
   4103 ;
   4104 ; CHECK:       outer.header:
   4105 ; CHECK-NEXT:    br label %inner.loopexit1
   4106 ;
   4107 ; CHECK:       inner.loopexit1:
   4108 ; CHECK-NEXT:    br label %outer.latch
   4109 ;
   4110 ; CHECK:       outer.latch:
   4111 ; CHECK-NEXT:    %outer.cond = call i1 @cond()
   4112 ; CHECK-NEXT:    br i1 %outer.cond, label %outer.header, label %[[EXIT_SPLIT:.*]]
   4113 ;
   4114 ; CHECK:       [[EXIT_SPLIT]]:
   4115 ; CHECK-NEXT:    br label %exit
   4116 
   4117 inner.loopexit2:
   4118   br label %outer.latch
   4119 
   4120 outer.latch:
   4121   %outer.cond = call i1 @cond()
   4122   br i1 %outer.cond, label %outer.header, label %exit
   4123 
   4124 exit:
   4125   ret void
   4126 ; CHECK:       exit:
   4127 ; CHECK-NEXT:    ret void
   4128 }
   4129