1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt -passes=indvars -S < %s | FileCheck %s
6 define i32 @test_01(ptr %p, ptr %s) {
7 ; CHECK-LABEL: @test_01(
9 ; CHECK-NEXT: [[START:%.*]] = load i32, ptr [[P:%.*]], align 4, !range [[RNG0:![0-9]+]]
10 ; CHECK-NEXT: [[END:%.*]] = load i32, ptr [[S:%.*]], align 4, !range [[RNG0]]
11 ; CHECK-NEXT: br label [[LOOP:%.*]]
13 ; CHECK-NEXT: [[IV:%.*]] = phi i32 [ [[START]], [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[BACKEDGE:%.*]] ]
14 ; CHECK-NEXT: [[C1:%.*]] = icmp slt i32 [[IV]], [[END]]
15 ; CHECK-NEXT: br i1 [[C1]], label [[GUARDED:%.*]], label [[SIDE_EXIT:%.*]]
17 ; CHECK-NEXT: br i1 true, label [[BACKEDGE]], label [[SIDE_EXIT]]
19 ; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1
20 ; CHECK-NEXT: [[LOOP_COND:%.*]] = call i1 @cond()
21 ; CHECK-NEXT: br i1 [[LOOP_COND]], label [[LOOP]], label [[EXIT:%.*]]
23 ; CHECK-NEXT: ret i32 1
25 ; CHECK-NEXT: ret i32 0
28 %start = load i32, ptr %p, !range !0
29 %end = load i32, ptr %s, !range !0
33 %iv = phi i32 [%start, %entry], [%iv.next, %backedge]
34 %c1 = icmp slt i32 %iv, %end
35 br i1 %c1, label %guarded, label %side_exit
38 %c2 = icmp ult i32 %iv, %end
39 br i1 %c2, label %backedge, label %side_exit
42 %iv.next = add nuw nsw i32 %iv, 1
43 %loop.cond = call i1 @cond()
44 br i1 %loop.cond, label %loop, label %exit
53 define i32 @test_02(ptr %p, ptr %s) {
54 ; CHECK-LABEL: @test_02(
56 ; CHECK-NEXT: [[START:%.*]] = load i32, ptr [[P:%.*]], align 4, !range [[RNG0]]
57 ; CHECK-NEXT: [[END:%.*]] = load i32, ptr [[S:%.*]], align 4, !range [[RNG0]]
58 ; CHECK-NEXT: br label [[LOOP:%.*]]
60 ; CHECK-NEXT: [[IV:%.*]] = phi i32 [ [[START]], [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[BACKEDGE:%.*]] ]
61 ; CHECK-NEXT: [[C1:%.*]] = icmp ult i32 [[IV]], [[END]]
62 ; CHECK-NEXT: br i1 [[C1]], label [[GUARDED:%.*]], label [[SIDE_EXIT:%.*]]
64 ; CHECK-NEXT: br i1 true, label [[BACKEDGE]], label [[SIDE_EXIT]]
66 ; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1
67 ; CHECK-NEXT: [[LOOP_COND:%.*]] = call i1 @cond()
68 ; CHECK-NEXT: br i1 [[LOOP_COND]], label [[LOOP]], label [[EXIT:%.*]]
70 ; CHECK-NEXT: ret i32 1
72 ; CHECK-NEXT: ret i32 0
75 %start = load i32, ptr %p, !range !0
76 %end = load i32, ptr %s, !range !0
80 %iv = phi i32 [%start, %entry], [%iv.next, %backedge]
81 %c1 = icmp ult i32 %iv, %end
82 br i1 %c1, label %guarded, label %side_exit
85 %c2 = icmp slt i32 %iv, %end
86 br i1 %c2, label %backedge, label %side_exit
89 %iv.next = add nuw nsw i32 %iv, 1
90 %loop.cond = call i1 @cond()
91 br i1 %loop.cond, label %loop, label %exit
100 !0 = !{i32 -1000, i32 0}