Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / Transforms / IndVarSimplify / shift-range-checks.ll
blob4f0ca5a854d571b1f4598d6e20e662cd0e926dce
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt -S < %s -passes=indvars | FileCheck %s
4 declare i1 @cond()
5 declare void @exit(i32 %code)
7 define void @test_01(ptr %p, i32 %shift) {
8 ; CHECK-LABEL: @test_01(
9 ; CHECK-NEXT:  entry:
10 ; CHECK-NEXT:    [[X:%.*]] = load i32, ptr [[P:%.*]], align 4, !range [[RNG0:![0-9]+]]
11 ; CHECK-NEXT:    [[X_SHIFTED:%.*]] = lshr i32 [[X]], [[SHIFT:%.*]]
12 ; CHECK-NEXT:    br label [[LOOP:%.*]]
13 ; CHECK:       loop:
14 ; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[BACKEDGE:%.*]] ]
15 ; CHECK-NEXT:    [[LESS_THAN_SHIFTED:%.*]] = icmp ult i32 [[IV]], [[X_SHIFTED]]
16 ; CHECK-NEXT:    br i1 [[LESS_THAN_SHIFTED]], label [[GUARDED:%.*]], label [[FAILURE:%.*]]
17 ; CHECK:       guarded:
18 ; CHECK-NEXT:    br i1 true, label [[BACKEDGE]], label [[NEVER_HAPPENS:%.*]]
19 ; CHECK:       backedge:
20 ; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1
21 ; CHECK-NEXT:    [[LOOP_COND:%.*]] = call i1 @cond()
22 ; CHECK-NEXT:    br i1 [[LOOP_COND]], label [[LOOP]], label [[DONE:%.*]]
23 ; CHECK:       done:
24 ; CHECK-NEXT:    ret void
25 ; CHECK:       failure:
26 ; CHECK-NEXT:    call void @exit(i32 1)
27 ; CHECK-NEXT:    unreachable
28 ; CHECK:       never_happens:
29 ; CHECK-NEXT:    call void @exit(i32 0)
30 ; CHECK-NEXT:    unreachable
32 entry:
33   %x = load i32, ptr %p, !range !0
34   %x.shifted = lshr i32 %x, %shift
35   br label %loop
37 loop:
38   %iv = phi i32 [0, %entry], [%iv.next, %backedge]
39   %less.than.shifted = icmp slt i32 %iv, %x.shifted
40   br i1 %less.than.shifted, label %guarded, label %failure
42 guarded:
43   %less.than.x = icmp slt i32 %iv, %x
44   br i1 %less.than.x, label %backedge, label %never_happens
46 backedge:
47   %iv.next = add nuw nsw i32 %iv, 1
48   %loop.cond = call i1 @cond()
49   br i1 %loop.cond, label %loop, label %done
51 done:
52   ret void
54 failure:
55   call void @exit(i32 1)
56   unreachable
58 never_happens:
59   call void @exit(i32 0)
60   unreachable
63 define void @test_02(ptr %p, i32 %shift) {
64 ; CHECK-LABEL: @test_02(
65 ; CHECK-NEXT:  entry:
66 ; CHECK-NEXT:    [[X:%.*]] = load i32, ptr [[P:%.*]], align 4, !range [[RNG0]]
67 ; CHECK-NEXT:    [[X_SHIFTED:%.*]] = lshr i32 [[X]], [[SHIFT:%.*]]
68 ; CHECK-NEXT:    br label [[LOOP:%.*]]
69 ; CHECK:       loop:
70 ; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[BACKEDGE:%.*]] ]
71 ; CHECK-NEXT:    [[LESS_THAN_SHIFTED:%.*]] = icmp ugt i32 [[X_SHIFTED]], [[IV]]
72 ; CHECK-NEXT:    br i1 [[LESS_THAN_SHIFTED]], label [[GUARDED:%.*]], label [[FAILURE:%.*]]
73 ; CHECK:       guarded:
74 ; CHECK-NEXT:    br i1 true, label [[BACKEDGE]], label [[NEVER_HAPPENS:%.*]]
75 ; CHECK:       backedge:
76 ; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1
77 ; CHECK-NEXT:    [[LOOP_COND:%.*]] = call i1 @cond()
78 ; CHECK-NEXT:    br i1 [[LOOP_COND]], label [[LOOP]], label [[DONE:%.*]]
79 ; CHECK:       done:
80 ; CHECK-NEXT:    ret void
81 ; CHECK:       failure:
82 ; CHECK-NEXT:    call void @exit(i32 1)
83 ; CHECK-NEXT:    unreachable
84 ; CHECK:       never_happens:
85 ; CHECK-NEXT:    call void @exit(i32 0)
86 ; CHECK-NEXT:    unreachable
88 entry:
89   %x = load i32, ptr %p, !range !0
90   %x.shifted = lshr i32 %x, %shift
91   br label %loop
93 loop:
94   %iv = phi i32 [0, %entry], [%iv.next, %backedge]
95   %less.than.shifted = icmp sgt i32 %x.shifted, %iv
96   br i1 %less.than.shifted, label %guarded, label %failure
98 guarded:
99   %less.than.x = icmp sgt i32 %x, %iv
100   br i1 %less.than.x, label %backedge, label %never_happens
102 backedge:
103   %iv.next = add nuw nsw i32 %iv, 1
104   %loop.cond = call i1 @cond()
105   br i1 %loop.cond, label %loop, label %done
107 done:
108   ret void
110 failure:
111   call void @exit(i32 1)
112   unreachable
114 never_happens:
115   call void @exit(i32 0)
116   unreachable
119 define void @test_03(ptr %p, i32 %shift) {
120 ; CHECK-LABEL: @test_03(
121 ; CHECK-NEXT:  entry:
122 ; CHECK-NEXT:    [[X:%.*]] = load i32, ptr [[P:%.*]], align 4, !range [[RNG0]]
123 ; CHECK-NEXT:    [[X_SHIFTED:%.*]] = lshr i32 [[X]], [[SHIFT:%.*]]
124 ; CHECK-NEXT:    br label [[LOOP:%.*]]
125 ; CHECK:       loop:
126 ; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[BACKEDGE:%.*]] ]
127 ; CHECK-NEXT:    [[LESS_THAN_SHIFTED:%.*]] = icmp ult i32 [[IV]], [[X_SHIFTED]]
128 ; CHECK-NEXT:    br i1 [[LESS_THAN_SHIFTED]], label [[GUARDED:%.*]], label [[FAILURE:%.*]]
129 ; CHECK:       guarded:
130 ; CHECK-NEXT:    br i1 true, label [[BACKEDGE]], label [[NEVER_HAPPENS:%.*]]
131 ; CHECK:       backedge:
132 ; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1
133 ; CHECK-NEXT:    [[LOOP_COND:%.*]] = call i1 @cond()
134 ; CHECK-NEXT:    br i1 [[LOOP_COND]], label [[LOOP]], label [[DONE:%.*]]
135 ; CHECK:       done:
136 ; CHECK-NEXT:    ret void
137 ; CHECK:       failure:
138 ; CHECK-NEXT:    call void @exit(i32 1)
139 ; CHECK-NEXT:    unreachable
140 ; CHECK:       never_happens:
141 ; CHECK-NEXT:    call void @exit(i32 0)
142 ; CHECK-NEXT:    unreachable
144 entry:
145   %x = load i32, ptr %p, !range !0
146   %x.shifted = lshr i32 %x, %shift
147   br label %loop
149 loop:
150   %iv = phi i32 [0, %entry], [%iv.next, %backedge]
151   %less.than.shifted = icmp ult i32 %iv, %x.shifted
152   br i1 %less.than.shifted, label %guarded, label %failure
154 guarded:
155   %less.than.x = icmp ult i32 %iv, %x
156   br i1 %less.than.x, label %backedge, label %never_happens
158 backedge:
159   %iv.next = add nuw nsw i32 %iv, 1
160   %loop.cond = call i1 @cond()
161   br i1 %loop.cond, label %loop, label %done
163 done:
164   ret void
166 failure:
167   call void @exit(i32 1)
168   unreachable
170 never_happens:
171   call void @exit(i32 0)
172   unreachable
175 define void @test_04(ptr %p, i32 %shift) {
176 ; CHECK-LABEL: @test_04(
177 ; CHECK-NEXT:  entry:
178 ; CHECK-NEXT:    [[X:%.*]] = load i32, ptr [[P:%.*]], align 4, !range [[RNG0]]
179 ; CHECK-NEXT:    [[X_SHIFTED:%.*]] = lshr i32 [[X]], [[SHIFT:%.*]]
180 ; CHECK-NEXT:    br label [[LOOP:%.*]]
181 ; CHECK:       loop:
182 ; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[BACKEDGE:%.*]] ]
183 ; CHECK-NEXT:    [[LESS_THAN_SHIFTED:%.*]] = icmp ugt i32 [[X_SHIFTED]], [[IV]]
184 ; CHECK-NEXT:    br i1 [[LESS_THAN_SHIFTED]], label [[GUARDED:%.*]], label [[FAILURE:%.*]]
185 ; CHECK:       guarded:
186 ; CHECK-NEXT:    br i1 true, label [[BACKEDGE]], label [[NEVER_HAPPENS:%.*]]
187 ; CHECK:       backedge:
188 ; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1
189 ; CHECK-NEXT:    [[LOOP_COND:%.*]] = call i1 @cond()
190 ; CHECK-NEXT:    br i1 [[LOOP_COND]], label [[LOOP]], label [[DONE:%.*]]
191 ; CHECK:       done:
192 ; CHECK-NEXT:    ret void
193 ; CHECK:       failure:
194 ; CHECK-NEXT:    call void @exit(i32 1)
195 ; CHECK-NEXT:    unreachable
196 ; CHECK:       never_happens:
197 ; CHECK-NEXT:    call void @exit(i32 0)
198 ; CHECK-NEXT:    unreachable
200 entry:
201   %x = load i32, ptr %p, !range !0
202   %x.shifted = lshr i32 %x, %shift
203   br label %loop
205 loop:
206   %iv = phi i32 [0, %entry], [%iv.next, %backedge]
207   %less.than.shifted = icmp ugt i32 %x.shifted, %iv
208   br i1 %less.than.shifted, label %guarded, label %failure
210 guarded:
211   %less.than.x = icmp ugt i32 %x, %iv
212   br i1 %less.than.x, label %backedge, label %never_happens
214 backedge:
215   %iv.next = add nuw nsw i32 %iv, 1
216   %loop.cond = call i1 @cond()
217   br i1 %loop.cond, label %loop, label %done
219 done:
220   ret void
222 failure:
223   call void @exit(i32 1)
224   unreachable
226 never_happens:
227   call void @exit(i32 0)
228   unreachable
231 !0 = !{i32 0, i32 2147483647}