| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py | 
 | ; RUN: opt -passes=loop-unroll -verify-loop-lcssa -S < %s | FileCheck %s | 
 |  | 
 | target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" | 
 | target triple = "x86_64-unknown-linux-gnu" | 
 |  | 
 | @b = external local_unnamed_addr global i32, align 4 | 
 |  | 
 | declare i1 @unknown(i32) readonly nounwind willreturn | 
 |  | 
 | define void @main() local_unnamed_addr #0 { | 
 | ; CHECK-LABEL: @main( | 
 | ; CHECK-NEXT:  ph1: | 
 | ; CHECK-NEXT:    br label [[H1:%.*]] | 
 | ; CHECK:       h1: | 
 | ; CHECK-NEXT:    [[D_0:%.*]] = phi i32 [ [[TMP0:%.*]], [[LATCH1:%.*]] ], [ undef, [[PH1:%.*]] ] | 
 | ; CHECK-NEXT:    br label [[PH2:%.*]] | 
 | ; CHECK:       ph2: | 
 | ; CHECK-NEXT:    br label [[H2:%.*]] | 
 | ; CHECK:       h2: | 
 | ; CHECK-NEXT:    br label [[H3:%.*]] | 
 | ; CHECK:       h3: | 
 | ; CHECK-NEXT:    [[C1:%.*]] = call i1 @unknown(i32 0) | 
 | ; CHECK-NEXT:    br i1 [[C1]], label [[LATCH3:%.*]], label [[EXIT_LOOPEXIT:%.*]] | 
 | ; CHECK:       latch3: | 
 | ; CHECK-NEXT:    [[C2:%.*]] = call i1 @unknown(i32 0) | 
 | ; CHECK-NEXT:    br i1 [[C2]], label [[EXIT3:%.*]], label [[H3]] | 
 | ; CHECK:       exit3: | 
 | ; CHECK-NEXT:    br label [[LATCH2:%.*]] | 
 | ; CHECK:       latch2: | 
 | ; CHECK-NEXT:    br label [[H3_1:%.*]] | 
 | ; CHECK:       h3.1: | 
 | ; CHECK-NEXT:    [[C1_1:%.*]] = call i1 @unknown(i32 1) | 
 | ; CHECK-NEXT:    br i1 [[C1_1]], label [[LATCH3_1:%.*]], label [[EXIT_LOOPEXIT1:%.*]] | 
 | ; CHECK:       latch3.1: | 
 | ; CHECK-NEXT:    [[C2_1:%.*]] = call i1 @unknown(i32 1) | 
 | ; CHECK-NEXT:    br i1 [[C2_1]], label [[EXIT3_1:%.*]], label [[H3_1]] | 
 | ; CHECK:       exit3.1: | 
 | ; CHECK-NEXT:    br label [[LATCH2_1:%.*]] | 
 | ; CHECK:       latch2.1: | 
 | ; CHECK-NEXT:    [[C3:%.*]] = call i1 @unknown(i32 [[D_0]]) | 
 | ; CHECK-NEXT:    br i1 [[C3]], label [[LATCH1]], label [[PH2]] | 
 | ; CHECK:       latch1: | 
 | ; CHECK-NEXT:    [[TMP0]] = load i32, ptr @b, align 4 | 
 | ; CHECK-NEXT:    br label [[H1]] | 
 | ; CHECK:       exit.loopexit: | 
 | ; CHECK-NEXT:    [[D_0_LCSSA_PH:%.*]] = phi i32 [ [[D_0]], [[H3]] ] | 
 | ; CHECK-NEXT:    br label [[EXIT:%.*]] | 
 | ; CHECK:       exit.loopexit1: | 
 | ; CHECK-NEXT:    [[D_0_LCSSA_PH2:%.*]] = phi i32 [ [[D_0]], [[H3_1]] ] | 
 | ; CHECK-NEXT:    br label [[EXIT]] | 
 | ; CHECK:       exit: | 
 | ; CHECK-NEXT:    [[D_0_LCSSA:%.*]] = phi i32 [ [[D_0_LCSSA_PH]], [[EXIT_LOOPEXIT]] ], [ [[D_0_LCSSA_PH2]], [[EXIT_LOOPEXIT1]] ] | 
 | ; CHECK-NEXT:    ret void | 
 | ; | 
 | ph1: | 
 |   br label %h1 | 
 |  | 
 | h1: | 
 |   %d.0 = phi i32 [ %1, %latch1 ], [ undef, %ph1 ] | 
 |   br label %ph2 | 
 |  | 
 | ph2: | 
 |   br label %h2 | 
 |  | 
 | h2: | 
 |   %0 = phi i32 [ 0, %ph2 ], [ %inc, %latch2 ] | 
 |   br label %h3 | 
 |  | 
 | h3: | 
 |   %c1 = call i1 @unknown(i32 %0) | 
 |   br i1 %c1, label %latch3, label %exit | 
 |  | 
 | latch3: | 
 |   %c2 = call i1 @unknown(i32 %0) | 
 |   br i1 %c2, label %exit3, label %h3 | 
 |  | 
 | exit3: | 
 |   br label %latch2 | 
 |  | 
 | latch2: | 
 |   %inc = add nuw nsw i32 %0, 1 | 
 |   %cmp = icmp slt i32 %inc, 2 | 
 |   br i1 %cmp, label %h2, label %exit2 | 
 |  | 
 | exit2: | 
 |   %c3 = call i1 @unknown(i32 %d.0) | 
 |   br i1 %c3, label %latch1, label %ph2 | 
 |  | 
 | latch1:                 ; preds = %exit2 | 
 |   %1 = load i32, ptr @b, align 4 | 
 |   br label %h1 | 
 |  | 
 | exit: | 
 |   %d.0.lcssa = phi i32 [ %d.0, %h3 ] | 
 |   ret void | 
 | } |