1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -passes=indvars -S | FileCheck %s 3 4define void @test_signed(i32 %start) { 5; CHECK-LABEL: @test_signed( 6; CHECK-NEXT: entry: 7; CHECK-NEXT: [[COND:%.*]] = icmp ne i32 [[START:%.*]], -2147483648 8; CHECK-NEXT: br i1 [[COND]], label [[LOOP_PREHEADER:%.*]], label [[EXIT:%.*]] 9; CHECK: loop.preheader: 10; CHECK-NEXT: br label [[LOOP:%.*]] 11; CHECK: loop: 12; CHECK-NEXT: [[IV:%.*]] = phi i32 [ [[IV_NEXT:%.*]], [[GUARDED:%.*]] ], [ [[START]], [[LOOP_PREHEADER]] ] 13; CHECK-NEXT: [[IV_NEXT]] = add i32 [[IV]], -1 14; CHECK-NEXT: [[CHECK:%.*]] = icmp slt i32 [[IV_NEXT]], [[IV]] 15; CHECK-NEXT: br i1 [[CHECK]], label [[GUARDED]], label [[FAIL:%.*]] 16; CHECK: guarded: 17; CHECK-NEXT: br i1 true, label [[LOOP]], label [[EXIT_LOOPEXIT:%.*]] 18; CHECK: exit.loopexit: 19; CHECK-NEXT: br label [[EXIT]] 20; CHECK: exit: 21; CHECK-NEXT: ret void 22; CHECK: fail: 23; CHECK-NEXT: unreachable 24; 25entry: 26 %cond = icmp ne i32 %start, -2147483648 27 br i1 %cond, label %loop, label %exit 28 29loop: 30 %iv = phi i32 [%start, %entry], [%iv.next, %guarded] 31 %iv.next = add i32 %iv, -1 32 %check = icmp slt i32 %iv.next, %iv 33 br i1 %check, label %guarded, label %fail 34 35guarded: 36 %loop.cond = icmp ne i32 %iv, -2147483648 37 br i1 %loop.cond, label %loop, label %exit 38 39exit: 40 ret void 41 42fail: 43 unreachable 44} 45 46define void @test_unsigned(i32 %start) { 47; CHECK-LABEL: @test_unsigned( 48; CHECK-NEXT: entry: 49; CHECK-NEXT: [[COND:%.*]] = icmp ne i32 [[START:%.*]], 0 50; CHECK-NEXT: br i1 [[COND]], label [[LOOP_PREHEADER:%.*]], label [[EXIT:%.*]] 51; CHECK: loop.preheader: 52; CHECK-NEXT: br label [[LOOP:%.*]] 53; CHECK: loop: 54; CHECK-NEXT: [[IV:%.*]] = phi i32 [ [[IV_NEXT:%.*]], [[GUARDED:%.*]] ], [ [[START]], [[LOOP_PREHEADER]] ] 55; CHECK-NEXT: [[IV_NEXT]] = add i32 [[IV]], -1 56; CHECK-NEXT: [[CHECK:%.*]] = icmp ult i32 [[IV_NEXT]], [[IV]] 57; CHECK-NEXT: br i1 [[CHECK]], label [[GUARDED]], label [[FAIL:%.*]] 58; CHECK: guarded: 59; CHECK-NEXT: br i1 true, label [[LOOP]], label [[EXIT_LOOPEXIT:%.*]] 60; CHECK: exit.loopexit: 61; CHECK-NEXT: br label [[EXIT]] 62; CHECK: exit: 63; CHECK-NEXT: ret void 64; CHECK: fail: 65; CHECK-NEXT: unreachable 66; 67entry: 68 %cond = icmp ne i32 %start, 0 69 br i1 %cond, label %loop, label %exit 70 71loop: 72 %iv = phi i32 [%start, %entry], [%iv.next, %guarded] 73 %iv.next = add i32 %iv, -1 74 %check = icmp ult i32 %iv.next, %iv 75 br i1 %check, label %guarded, label %fail 76 77guarded: 78 %loop.cond = icmp ne i32 %iv, 0 79 br i1 %loop.cond, label %loop, label %exit 80 81exit: 82 ret void 83 84fail: 85 unreachable 86} 87