|  | ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py | 
|  | ; RUN: opt -passes=indvars -S < %s | FileCheck %s | 
|  |  | 
|  | define void @ult(i64 %n, i64 %m) { | 
|  | ; CHECK-LABEL: @ult( | 
|  | ; CHECK-NEXT:  entry: | 
|  | ; CHECK-NEXT:    [[CMP0:%.*]] = icmp ult i64 [[N:%.*]], [[M:%.*]] | 
|  | ; CHECK-NEXT:    br i1 [[CMP0]], label [[LOOP_PREHEADER:%.*]], label [[EXIT:%.*]] | 
|  | ; CHECK:       loop.preheader: | 
|  | ; CHECK-NEXT:    br label [[LOOP:%.*]] | 
|  | ; CHECK:       loop: | 
|  | ; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[LATCH:%.*]] ], [ 0, [[LOOP_PREHEADER]] ] | 
|  | ; CHECK-NEXT:    [[IV_NEXT]] = add i64 [[IV]], 1 | 
|  | ; CHECK-NEXT:    [[CMP1:%.*]] = icmp ult i64 [[IV]], [[N]] | 
|  | ; CHECK-NEXT:    br i1 [[CMP1]], label [[LATCH]], label [[EXIT_LOOPEXIT:%.*]] | 
|  | ; CHECK:       latch: | 
|  | ; CHECK-NEXT:    call void @side_effect() | 
|  | ; CHECK-NEXT:    br i1 true, label [[LOOP]], label [[EXIT_LOOPEXIT]] | 
|  | ; CHECK:       exit.loopexit: | 
|  | ; CHECK-NEXT:    br label [[EXIT]] | 
|  | ; CHECK:       exit: | 
|  | ; CHECK-NEXT:    ret void | 
|  | ; | 
|  | entry: | 
|  | %cmp0 = icmp ult i64 %n, %m | 
|  | br i1 %cmp0, label %loop, label %exit | 
|  | loop: | 
|  | %iv = phi i64 [ 0, %entry ], [ %iv.next, %latch ] | 
|  | %iv.next = add i64 %iv, 1 | 
|  | %cmp1 = icmp ult i64 %iv, %n | 
|  | br i1 %cmp1, label %latch, label %exit | 
|  | latch: | 
|  | call void @side_effect() | 
|  | %cmp2 = icmp ult i64 %iv, %m | 
|  | br i1 %cmp2, label %loop, label %exit | 
|  | exit: | 
|  | ret void | 
|  | } | 
|  |  | 
|  | define void @ugt(i64 %n, i64 %m) { | 
|  | ; CHECK-LABEL: @ugt( | 
|  | ; CHECK-NEXT:  entry: | 
|  | ; CHECK-NEXT:    [[CMP0:%.*]] = icmp ugt i64 [[N:%.*]], [[M:%.*]] | 
|  | ; CHECK-NEXT:    br i1 [[CMP0]], label [[LOOP_PREHEADER:%.*]], label [[EXIT:%.*]] | 
|  | ; CHECK:       loop.preheader: | 
|  | ; CHECK-NEXT:    br label [[LOOP:%.*]] | 
|  | ; CHECK:       loop: | 
|  | ; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[LATCH:%.*]] ], [ 0, [[LOOP_PREHEADER]] ] | 
|  | ; CHECK-NEXT:    [[IV_NEXT]] = add i64 [[IV]], 1 | 
|  | ; CHECK-NEXT:    br i1 true, label [[LATCH]], label [[EXIT_LOOPEXIT:%.*]] | 
|  | ; CHECK:       latch: | 
|  | ; CHECK-NEXT:    call void @side_effect() | 
|  | ; CHECK-NEXT:    [[CMP2:%.*]] = icmp ult i64 [[IV]], [[M]] | 
|  | ; CHECK-NEXT:    br i1 [[CMP2]], label [[LOOP]], label [[EXIT_LOOPEXIT]] | 
|  | ; CHECK:       exit.loopexit: | 
|  | ; CHECK-NEXT:    br label [[EXIT]] | 
|  | ; CHECK:       exit: | 
|  | ; CHECK-NEXT:    ret void | 
|  | ; | 
|  | entry: | 
|  | %cmp0 = icmp ugt i64 %n, %m | 
|  | br i1 %cmp0, label %loop, label %exit | 
|  | loop: | 
|  | %iv = phi i64 [ 0, %entry ], [ %iv.next, %latch ] | 
|  | %iv.next = add i64 %iv, 1 | 
|  | %cmp1 = icmp ult i64 %iv, %n | 
|  | br i1 %cmp1, label %latch, label %exit | 
|  | latch: | 
|  | call void @side_effect() | 
|  | %cmp2 = icmp ult i64 %iv, %m | 
|  | br i1 %cmp2, label %loop, label %exit | 
|  | exit: | 
|  | ret void | 
|  | } | 
|  |  | 
|  | define void @ule(i64 %n, i64 %m) { | 
|  | ; CHECK-LABEL: @ule( | 
|  | ; CHECK-NEXT:  entry: | 
|  | ; CHECK-NEXT:    [[CMP0:%.*]] = icmp ule i64 [[N:%.*]], [[M:%.*]] | 
|  | ; CHECK-NEXT:    br i1 [[CMP0]], label [[LOOP_PREHEADER:%.*]], label [[EXIT:%.*]] | 
|  | ; CHECK:       loop.preheader: | 
|  | ; CHECK-NEXT:    br label [[LOOP:%.*]] | 
|  | ; CHECK:       loop: | 
|  | ; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[LATCH:%.*]] ], [ 0, [[LOOP_PREHEADER]] ] | 
|  | ; CHECK-NEXT:    [[IV_NEXT]] = add i64 [[IV]], 1 | 
|  | ; CHECK-NEXT:    [[CMP1:%.*]] = icmp ult i64 [[IV]], [[N]] | 
|  | ; CHECK-NEXT:    br i1 [[CMP1]], label [[LATCH]], label [[EXIT_LOOPEXIT:%.*]] | 
|  | ; CHECK:       latch: | 
|  | ; CHECK-NEXT:    call void @side_effect() | 
|  | ; CHECK-NEXT:    [[CMP2:%.*]] = icmp ult i64 [[IV]], [[M]] | 
|  | ; CHECK-NEXT:    br i1 [[CMP2]], label [[LOOP]], label [[EXIT_LOOPEXIT]] | 
|  | ; CHECK:       exit.loopexit: | 
|  | ; CHECK-NEXT:    br label [[EXIT]] | 
|  | ; CHECK:       exit: | 
|  | ; CHECK-NEXT:    ret void | 
|  | ; | 
|  | entry: | 
|  | %cmp0 = icmp ule i64 %n, %m | 
|  | br i1 %cmp0, label %loop, label %exit | 
|  | loop: | 
|  | %iv = phi i64 [ 0, %entry ], [ %iv.next, %latch ] | 
|  | %iv.next = add i64 %iv, 1 | 
|  | %cmp1 = icmp ult i64 %iv, %n | 
|  | br i1 %cmp1, label %latch, label %exit | 
|  | latch: | 
|  | call void @side_effect() | 
|  | %cmp2 = icmp ult i64 %iv, %m | 
|  | br i1 %cmp2, label %loop, label %exit | 
|  | exit: | 
|  | ret void | 
|  | } | 
|  |  | 
|  | define void @uge(i64 %n, i64 %m) { | 
|  | ; CHECK-LABEL: @uge( | 
|  | ; CHECK-NEXT:  entry: | 
|  | ; CHECK-NEXT:    [[CMP0:%.*]] = icmp uge i64 [[N:%.*]], [[M:%.*]] | 
|  | ; CHECK-NEXT:    br i1 [[CMP0]], label [[LOOP_PREHEADER:%.*]], label [[EXIT:%.*]] | 
|  | ; CHECK:       loop.preheader: | 
|  | ; CHECK-NEXT:    br label [[LOOP:%.*]] | 
|  | ; CHECK:       loop: | 
|  | ; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[LATCH:%.*]] ], [ 0, [[LOOP_PREHEADER]] ] | 
|  | ; CHECK-NEXT:    [[IV_NEXT]] = add i64 [[IV]], 1 | 
|  | ; CHECK-NEXT:    [[CMP1:%.*]] = icmp ult i64 [[IV]], [[N]] | 
|  | ; CHECK-NEXT:    br i1 [[CMP1]], label [[LATCH]], label [[EXIT_LOOPEXIT:%.*]] | 
|  | ; CHECK:       latch: | 
|  | ; CHECK-NEXT:    call void @side_effect() | 
|  | ; CHECK-NEXT:    [[CMP2:%.*]] = icmp ult i64 [[IV]], [[M]] | 
|  | ; CHECK-NEXT:    br i1 [[CMP2]], label [[LOOP]], label [[EXIT_LOOPEXIT]] | 
|  | ; CHECK:       exit.loopexit: | 
|  | ; CHECK-NEXT:    br label [[EXIT]] | 
|  | ; CHECK:       exit: | 
|  | ; CHECK-NEXT:    ret void | 
|  | ; | 
|  | entry: | 
|  | %cmp0 = icmp uge i64 %n, %m | 
|  | br i1 %cmp0, label %loop, label %exit | 
|  | loop: | 
|  | %iv = phi i64 [ 0, %entry ], [ %iv.next, %latch ] | 
|  | %iv.next = add i64 %iv, 1 | 
|  | %cmp1 = icmp ult i64 %iv, %n | 
|  | br i1 %cmp1, label %latch, label %exit | 
|  | latch: | 
|  | call void @side_effect() | 
|  | %cmp2 = icmp ult i64 %iv, %m | 
|  | br i1 %cmp2, label %loop, label %exit | 
|  | exit: | 
|  | ret void | 
|  | } | 
|  |  | 
|  |  | 
|  | define void @ult_const_max(i64 %n) { | 
|  | ; CHECK-LABEL: @ult_const_max( | 
|  | ; CHECK-NEXT:  entry: | 
|  | ; CHECK-NEXT:    [[CMP0:%.*]] = icmp ult i64 [[N:%.*]], 20 | 
|  | ; CHECK-NEXT:    br i1 [[CMP0]], label [[LOOP_PREHEADER:%.*]], label [[EXIT:%.*]] | 
|  | ; CHECK:       loop.preheader: | 
|  | ; CHECK-NEXT:    br label [[LOOP:%.*]] | 
|  | ; CHECK:       loop: | 
|  | ; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[LATCH:%.*]] ], [ 0, [[LOOP_PREHEADER]] ] | 
|  | ; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1 | 
|  | ; CHECK-NEXT:    br i1 true, label [[LATCH]], label [[EXIT_LOOPEXIT:%.*]] | 
|  | ; CHECK:       latch: | 
|  | ; CHECK-NEXT:    call void @side_effect() | 
|  | ; CHECK-NEXT:    [[CMP2:%.*]] = icmp ult i64 [[IV]], [[N]] | 
|  | ; CHECK-NEXT:    br i1 [[CMP2]], label [[LOOP]], label [[EXIT_LOOPEXIT]] | 
|  | ; CHECK:       exit.loopexit: | 
|  | ; CHECK-NEXT:    br label [[EXIT]] | 
|  | ; CHECK:       exit: | 
|  | ; CHECK-NEXT:    ret void | 
|  | ; | 
|  | entry: | 
|  | %cmp0 = icmp ult i64 %n, 20 | 
|  | br i1 %cmp0, label %loop, label %exit | 
|  | loop: | 
|  | %iv = phi i64 [ 0, %entry ], [ %iv.next, %latch ] | 
|  | %iv.next = add i64 %iv, 1 | 
|  | %udiv = udiv i64 %iv, 10 | 
|  | %cmp1 = icmp ult i64 %udiv, 2 | 
|  | br i1 %cmp1, label %latch, label %exit | 
|  | latch: | 
|  | call void @side_effect() | 
|  | %cmp2 = icmp ult i64 %iv, %n | 
|  | br i1 %cmp2, label %loop, label %exit | 
|  | exit: | 
|  | ret void | 
|  | } | 
|  |  | 
|  | define void @mixed_width(i32 %len) { | 
|  | ; CHECK-LABEL: @mixed_width( | 
|  | ; CHECK-NEXT:  entry: | 
|  | ; CHECK-NEXT:    [[LEN_ZEXT:%.*]] = zext i32 [[LEN:%.*]] to i64 | 
|  | ; CHECK-NEXT:    br label [[LOOP:%.*]] | 
|  | ; CHECK:       loop: | 
|  | ; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[BACKEDGE:%.*]] ] | 
|  | ; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1 | 
|  | ; CHECK-NEXT:    [[CMP1:%.*]] = icmp ult i64 [[IV]], [[LEN_ZEXT]] | 
|  | ; CHECK-NEXT:    br i1 [[CMP1]], label [[BACKEDGE]], label [[EXIT:%.*]] | 
|  | ; CHECK:       backedge: | 
|  | ; CHECK-NEXT:    call void @side_effect() | 
|  | ; CHECK-NEXT:    br i1 true, label [[LOOP]], label [[EXIT]] | 
|  | ; CHECK:       exit: | 
|  | ; CHECK-NEXT:    ret void | 
|  | ; | 
|  | entry: | 
|  | %len.zext = zext i32 %len to i64 | 
|  | br label %loop | 
|  | loop: | 
|  | %iv = phi i64 [0, %entry], [%iv.next, %backedge] | 
|  | %iv2 = phi i32 [0, %entry], [%iv2.next, %backedge] | 
|  | %iv.next = add i64 %iv, 1 | 
|  | %iv2.next = add i32 %iv2, 1 | 
|  | %cmp1 = icmp ult i64 %iv, %len.zext | 
|  | br i1 %cmp1, label %backedge, label %exit | 
|  |  | 
|  | backedge: | 
|  | call void @side_effect() | 
|  | %cmp2 = icmp ult i32 %iv2, %len | 
|  | br i1 %cmp2, label %loop, label %exit | 
|  | exit: | 
|  | ret void | 
|  | } | 
|  |  | 
|  | define void @many_exits([100 x i64] %len) { | 
|  | entry: | 
|  | br label %loop | 
|  | loop: | 
|  | %iv = phi i64 [0, %entry], [%iv.next, %backedge] | 
|  | %len0 = extractvalue [100 x i64] %len, 0 | 
|  | %early0 = icmp eq i64 %iv, %len0 | 
|  | call void @side_effect() | 
|  | br i1 %early0, label %exit, label %cont0 | 
|  | cont0: | 
|  | %len1 = extractvalue [100 x i64] %len, 1 | 
|  | %early1 = icmp eq i64 %iv, %len1 | 
|  | call void @side_effect() | 
|  | br i1 %early1, label %exit, label %cont1 | 
|  | cont1: | 
|  | %len2 = extractvalue [100 x i64] %len, 2 | 
|  | %early2 = icmp eq i64 %iv, %len2 | 
|  | call void @side_effect() | 
|  | br i1 %early2, label %exit, label %cont2 | 
|  | cont2: | 
|  | %len3 = extractvalue [100 x i64] %len, 3 | 
|  | %early3 = icmp eq i64 %iv, %len3 | 
|  | call void @side_effect() | 
|  | br i1 %early3, label %exit, label %cont3 | 
|  | cont3: | 
|  | %len4 = extractvalue [100 x i64] %len, 4 | 
|  | %early4 = icmp eq i64 %iv, %len4 | 
|  | call void @side_effect() | 
|  | br i1 %early4, label %exit, label %cont4 | 
|  | cont4: | 
|  | %len5 = extractvalue [100 x i64] %len, 5 | 
|  | %early5 = icmp eq i64 %iv, %len5 | 
|  | call void @side_effect() | 
|  | br i1 %early5, label %exit, label %cont5 | 
|  | cont5: | 
|  | %len6 = extractvalue [100 x i64] %len, 6 | 
|  | %early6 = icmp eq i64 %iv, %len6 | 
|  | call void @side_effect() | 
|  | br i1 %early6, label %exit, label %cont6 | 
|  | cont6: | 
|  | %len7 = extractvalue [100 x i64] %len, 7 | 
|  | %early7 = icmp eq i64 %iv, %len7 | 
|  | call void @side_effect() | 
|  | br i1 %early7, label %exit, label %cont7 | 
|  | cont7: | 
|  | %len8 = extractvalue [100 x i64] %len, 8 | 
|  | %early8 = icmp eq i64 %iv, %len8 | 
|  | call void @side_effect() | 
|  | br i1 %early8, label %exit, label %cont8 | 
|  | cont8: | 
|  | %len9 = extractvalue [100 x i64] %len, 9 | 
|  | %early9 = icmp eq i64 %iv, %len9 | 
|  | call void @side_effect() | 
|  | br i1 %early9, label %exit, label %cont9 | 
|  | cont9: | 
|  | %len10 = extractvalue [100 x i64] %len, 10 | 
|  | %early10 = icmp eq i64 %iv, %len10 | 
|  | call void @side_effect() | 
|  | br i1 %early10, label %exit, label %cont10 | 
|  | cont10: | 
|  | %len11 = extractvalue [100 x i64] %len, 11 | 
|  | %early11 = icmp eq i64 %iv, %len11 | 
|  | call void @side_effect() | 
|  | br i1 %early11, label %exit, label %cont11 | 
|  | cont11: | 
|  | %len12 = extractvalue [100 x i64] %len, 12 | 
|  | %early12 = icmp eq i64 %iv, %len12 | 
|  | call void @side_effect() | 
|  | br i1 %early12, label %exit, label %cont12 | 
|  | cont12: | 
|  | %len13 = extractvalue [100 x i64] %len, 13 | 
|  | %early13 = icmp eq i64 %iv, %len13 | 
|  | call void @side_effect() | 
|  | br i1 %early13, label %exit, label %cont13 | 
|  | cont13: | 
|  | %len14 = extractvalue [100 x i64] %len, 14 | 
|  | %early14 = icmp eq i64 %iv, %len14 | 
|  | call void @side_effect() | 
|  | br i1 %early14, label %exit, label %cont14 | 
|  | cont14: | 
|  | %len15 = extractvalue [100 x i64] %len, 15 | 
|  | %early15 = icmp eq i64 %iv, %len15 | 
|  | call void @side_effect() | 
|  | br i1 %early15, label %exit, label %cont15 | 
|  | cont15: | 
|  | %len16 = extractvalue [100 x i64] %len, 16 | 
|  | %early16 = icmp eq i64 %iv, %len16 | 
|  | call void @side_effect() | 
|  | br i1 %early16, label %exit, label %cont16 | 
|  | cont16: | 
|  | %len17 = extractvalue [100 x i64] %len, 17 | 
|  | %early17 = icmp eq i64 %iv, %len17 | 
|  | call void @side_effect() | 
|  | br i1 %early17, label %exit, label %cont17 | 
|  | cont17: | 
|  | %len18 = extractvalue [100 x i64] %len, 18 | 
|  | %early18 = icmp eq i64 %iv, %len18 | 
|  | call void @side_effect() | 
|  | br i1 %early18, label %exit, label %cont18 | 
|  | cont18: | 
|  | %len19 = extractvalue [100 x i64] %len, 19 | 
|  | %early19 = icmp eq i64 %iv, %len19 | 
|  | call void @side_effect() | 
|  | br i1 %early19, label %exit, label %cont19 | 
|  | cont19: | 
|  | %len20 = extractvalue [100 x i64] %len, 20 | 
|  | %early20 = icmp eq i64 %iv, %len20 | 
|  | call void @side_effect() | 
|  | br i1 %early20, label %exit, label %cont20 | 
|  | cont20: | 
|  | %len21 = extractvalue [100 x i64] %len, 21 | 
|  | %early21 = icmp eq i64 %iv, %len21 | 
|  | call void @side_effect() | 
|  | br i1 %early21, label %exit, label %cont21 | 
|  | cont21: | 
|  | %len22 = extractvalue [100 x i64] %len, 22 | 
|  | %early22 = icmp eq i64 %iv, %len22 | 
|  | call void @side_effect() | 
|  | br i1 %early22, label %exit, label %cont22 | 
|  | cont22: | 
|  | %len23 = extractvalue [100 x i64] %len, 23 | 
|  | %early23 = icmp eq i64 %iv, %len23 | 
|  | call void @side_effect() | 
|  | br i1 %early23, label %exit, label %cont23 | 
|  | cont23: | 
|  | %len24 = extractvalue [100 x i64] %len, 24 | 
|  | %early24 = icmp eq i64 %iv, %len24 | 
|  | call void @side_effect() | 
|  | br i1 %early24, label %exit, label %cont24 | 
|  | cont24: | 
|  | %len25 = extractvalue [100 x i64] %len, 25 | 
|  | %early25 = icmp eq i64 %iv, %len25 | 
|  | call void @side_effect() | 
|  | br i1 %early25, label %exit, label %cont25 | 
|  | cont25: | 
|  | %len26 = extractvalue [100 x i64] %len, 26 | 
|  | %early26 = icmp eq i64 %iv, %len26 | 
|  | call void @side_effect() | 
|  | br i1 %early26, label %exit, label %cont26 | 
|  | cont26: | 
|  | %len27 = extractvalue [100 x i64] %len, 27 | 
|  | %early27 = icmp eq i64 %iv, %len27 | 
|  | call void @side_effect() | 
|  | br i1 %early27, label %exit, label %cont27 | 
|  | cont27: | 
|  | %len28 = extractvalue [100 x i64] %len, 28 | 
|  | %early28 = icmp eq i64 %iv, %len28 | 
|  | call void @side_effect() | 
|  | br i1 %early28, label %exit, label %cont28 | 
|  | cont28: | 
|  | %len29 = extractvalue [100 x i64] %len, 29 | 
|  | %early29 = icmp eq i64 %iv, %len29 | 
|  | call void @side_effect() | 
|  | br i1 %early29, label %exit, label %cont29 | 
|  | cont29: | 
|  | %len30 = extractvalue [100 x i64] %len, 30 | 
|  | %early30 = icmp eq i64 %iv, %len30 | 
|  | call void @side_effect() | 
|  | br i1 %early30, label %exit, label %cont30 | 
|  | cont30: | 
|  | %len31 = extractvalue [100 x i64] %len, 31 | 
|  | %early31 = icmp eq i64 %iv, %len31 | 
|  | call void @side_effect() | 
|  | br i1 %early31, label %exit, label %cont31 | 
|  | cont31: | 
|  | %len32 = extractvalue [100 x i64] %len, 32 | 
|  | %early32 = icmp eq i64 %iv, %len32 | 
|  | call void @side_effect() | 
|  | br i1 %early32, label %exit, label %cont32 | 
|  | cont32: | 
|  | %len33 = extractvalue [100 x i64] %len, 33 | 
|  | %early33 = icmp eq i64 %iv, %len33 | 
|  | call void @side_effect() | 
|  | br i1 %early33, label %exit, label %cont33 | 
|  | cont33: | 
|  | %len34 = extractvalue [100 x i64] %len, 34 | 
|  | %early34 = icmp eq i64 %iv, %len34 | 
|  | call void @side_effect() | 
|  | br i1 %early34, label %exit, label %cont34 | 
|  | cont34: | 
|  | %len35 = extractvalue [100 x i64] %len, 35 | 
|  | %early35 = icmp eq i64 %iv, %len35 | 
|  | call void @side_effect() | 
|  | br i1 %early35, label %exit, label %cont35 | 
|  | cont35: | 
|  | %len36 = extractvalue [100 x i64] %len, 36 | 
|  | %early36 = icmp eq i64 %iv, %len36 | 
|  | call void @side_effect() | 
|  | br i1 %early36, label %exit, label %cont36 | 
|  | cont36: | 
|  | %len37 = extractvalue [100 x i64] %len, 37 | 
|  | %early37 = icmp eq i64 %iv, %len37 | 
|  | call void @side_effect() | 
|  | br i1 %early37, label %exit, label %cont37 | 
|  | cont37: | 
|  | %len38 = extractvalue [100 x i64] %len, 38 | 
|  | %early38 = icmp eq i64 %iv, %len38 | 
|  | call void @side_effect() | 
|  | br i1 %early38, label %exit, label %cont38 | 
|  | cont38: | 
|  | %len39 = extractvalue [100 x i64] %len, 39 | 
|  | %early39 = icmp eq i64 %iv, %len39 | 
|  | call void @side_effect() | 
|  | br i1 %early39, label %exit, label %cont39 | 
|  | cont39: | 
|  | br label %backedge | 
|  | backedge: | 
|  | call void @side_effect() | 
|  | %cmp2 = icmp ult i64 %iv, 999 | 
|  | %iv.next = add i64 %iv, 1 | 
|  | br i1 %cmp2, label %loop, label %exit | 
|  | exit: | 
|  | ret void | 
|  | } | 
|  |  | 
|  | declare void @side_effect() | 
|  |  | 
|  | ; The exit condition %outer.cond.1 depends on a phi in %inner. Make sure we do | 
|  | ; not incorrectly determine %x.lcssa <= -1. | 
|  | define i32 @exit_cond_depends_on_inner_loop() { | 
|  | ; CHECK-LABEL: @exit_cond_depends_on_inner_loop( | 
|  | ; CHECK-NEXT:  entry: | 
|  | ; CHECK-NEXT:    br label [[OUTER_HEADER:%.*]] | 
|  | ; CHECK:       outer.header: | 
|  | ; CHECK-NEXT:    [[IV_OUTER:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_OUTER_NEXT:%.*]], [[OUTER_LATCH:%.*]] ] | 
|  | ; CHECK-NEXT:    br label [[INNER:%.*]] | 
|  | ; CHECK:       inner: | 
|  | ; CHECK-NEXT:    [[X:%.*]] = phi i32 [ -1, [[OUTER_HEADER]] ], [ [[CALL:%.*]], [[INNER]] ] | 
|  | ; CHECK-NEXT:    [[CALL]] = call i32 @match() | 
|  | ; CHECK-NEXT:    [[INNER_COND:%.*]] = icmp sgt i32 [[CALL]], -1 | 
|  | ; CHECK-NEXT:    br i1 [[INNER_COND]], label [[INNER]], label [[OUTER_EXITING_1:%.*]] | 
|  | ; CHECK:       outer.exiting.1: | 
|  | ; CHECK-NEXT:    [[X_LCSSA:%.*]] = phi i32 [ [[X]], [[INNER]] ] | 
|  | ; CHECK-NEXT:    [[OUTER_COND_1:%.*]] = icmp sgt i32 [[X_LCSSA]], -1 | 
|  | ; CHECK-NEXT:    br i1 [[OUTER_COND_1]], label [[EXIT:%.*]], label [[OUTER_LATCH]] | 
|  | ; CHECK:       outer.latch: | 
|  | ; CHECK-NEXT:    [[IV_OUTER_NEXT]] = add nuw nsw i32 [[IV_OUTER]], 1 | 
|  | ; CHECK-NEXT:    [[OUTER_COND_2:%.*]] = icmp ult i32 [[IV_OUTER]], 100 | 
|  | ; CHECK-NEXT:    br i1 [[OUTER_COND_2]], label [[OUTER_HEADER]], label [[EXIT]] | 
|  | ; CHECK:       exit: | 
|  | ; CHECK-NEXT:    [[X_RES:%.*]] = phi i32 [ [[X_LCSSA]], [[OUTER_EXITING_1]] ], [ -1, [[OUTER_LATCH]] ] | 
|  | ; CHECK-NEXT:    ret i32 [[X_RES]] | 
|  | ; | 
|  | entry: | 
|  | br label %outer.header | 
|  |  | 
|  | outer.header: | 
|  | %iv.outer = phi i32 [ 0, %entry ], [ %iv.outer.next , %outer.latch ] | 
|  | br label %inner | 
|  |  | 
|  | inner: | 
|  | %x = phi i32 [ -1, %outer.header ], [ %call, %inner ] | 
|  | %call = call i32 @match() | 
|  | %inner.cond = icmp sgt i32 %call, -1 | 
|  | br i1 %inner.cond, label %inner, label %outer.exiting.1 | 
|  |  | 
|  | outer.exiting.1: | 
|  | %x.lcssa = phi i32 [ %x, %inner ] | 
|  | %outer.cond.1 = icmp sgt i32 %x.lcssa, -1 | 
|  | br i1 %outer.cond.1, label %exit, label %outer.latch | 
|  |  | 
|  | outer.latch: | 
|  | %iv.outer.next = add nuw nsw i32 %iv.outer, 1 | 
|  | %outer.cond.2 = icmp ult i32 %iv.outer, 100 | 
|  | br i1 %outer.cond.2, label %outer.header, label %exit | 
|  |  | 
|  | exit: | 
|  | %x.res = phi i32 [ %x.lcssa, %outer.exiting.1 ], [ -1, %outer.latch ] | 
|  | ret i32 %x.res | 
|  | } | 
|  |  | 
|  | declare i32 @match() |