1 ; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py
2 ; RUN: opt -passes='print<scalar-evolution>' -disable-output %s 2>&1 | FileCheck %s
6 define void @test_trip_multiple_4(i32 %num) {
7 ; CHECK-LABEL: 'test_trip_multiple_4'
8 ; CHECK-NEXT: Classifying expressions for: @test_trip_multiple_4
9 ; CHECK-NEXT: %u = urem i32 %num, 4
10 ; CHECK-NEXT: --> (zext i2 (trunc i32 %num to i2) to i32) U: [0,4) S: [0,4)
11 ; CHECK-NEXT: %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
12 ; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%for.body> U: [0,-2147483648) S: [0,-2147483648) Exits: (-1 + %num) LoopDispositions: { %for.body: Computable }
13 ; CHECK-NEXT: %inc = add nuw nsw i32 %i.010, 1
14 ; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%for.body> U: [1,-2147483648) S: [1,-2147483648) Exits: %num LoopDispositions: { %for.body: Computable }
15 ; CHECK-NEXT: Determining loop execution counts for: @test_trip_multiple_4
16 ; CHECK-NEXT: Loop %for.body: backedge-taken count is (-1 + %num)
17 ; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i32 -2
18 ; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (-1 + %num)
19 ; CHECK-NEXT: Loop %for.body: Trip multiple is 4
23 %cmp = icmp eq i32 %u, 0
24 tail call void @llvm.assume(i1 %cmp)
25 %cmp.1 = icmp uge i32 %num, 4
26 tail call void @llvm.assume(i1 %cmp.1)
30 %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
31 %inc = add nuw nsw i32 %i.010, 1
32 %cmp2 = icmp ult i32 %inc, %num
33 br i1 %cmp2, label %for.body, label %exit
39 define void @test_trip_multiple_4_guard(i32 %num) {
40 ; CHECK-LABEL: 'test_trip_multiple_4_guard'
41 ; CHECK-NEXT: Classifying expressions for: @test_trip_multiple_4_guard
42 ; CHECK-NEXT: %u = urem i32 %num, 4
43 ; CHECK-NEXT: --> (zext i2 (trunc i32 %num to i2) to i32) U: [0,4) S: [0,4)
44 ; CHECK-NEXT: %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
45 ; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%for.body> U: [0,-2147483648) S: [0,-2147483648) Exits: (-1 + %num) LoopDispositions: { %for.body: Computable }
46 ; CHECK-NEXT: %inc = add nuw nsw i32 %i.010, 1
47 ; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%for.body> U: [1,-2147483648) S: [1,-2147483648) Exits: %num LoopDispositions: { %for.body: Computable }
48 ; CHECK-NEXT: Determining loop execution counts for: @test_trip_multiple_4_guard
49 ; CHECK-NEXT: Loop %for.body: backedge-taken count is (-1 + %num)
50 ; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i32 -2
51 ; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (-1 + %num)
52 ; CHECK-NEXT: Loop %for.body: Trip multiple is 4
56 %cmp = icmp eq i32 %u, 0
57 call void(i1, ...) @llvm.experimental.guard(i1 %cmp) [ "deopt"() ]
58 %cmp.1 = icmp uge i32 %num, 4
59 call void(i1, ...) @llvm.experimental.guard(i1 %cmp.1) [ "deopt"() ]
63 %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
64 %inc = add nuw nsw i32 %i.010, 1
65 %cmp2 = icmp ult i32 %inc, %num
66 br i1 %cmp2, label %for.body, label %exit
73 define void @test_trip_multiple_4_ugt_5(i32 %num) {
74 ; CHECK-LABEL: 'test_trip_multiple_4_ugt_5'
75 ; CHECK-NEXT: Classifying expressions for: @test_trip_multiple_4_ugt_5
76 ; CHECK-NEXT: %u = urem i32 %num, 4
77 ; CHECK-NEXT: --> (zext i2 (trunc i32 %num to i2) to i32) U: [0,4) S: [0,4)
78 ; CHECK-NEXT: %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
79 ; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%for.body> U: [0,-2147483648) S: [0,-2147483648) Exits: (-1 + %num) LoopDispositions: { %for.body: Computable }
80 ; CHECK-NEXT: %inc = add nuw nsw i32 %i.010, 1
81 ; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%for.body> U: [1,-2147483648) S: [1,-2147483648) Exits: %num LoopDispositions: { %for.body: Computable }
82 ; CHECK-NEXT: Determining loop execution counts for: @test_trip_multiple_4_ugt_5
83 ; CHECK-NEXT: Loop %for.body: backedge-taken count is (-1 + %num)
84 ; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i32 -2
85 ; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (-1 + %num)
86 ; CHECK-NEXT: Loop %for.body: Trip multiple is 4
90 %cmp = icmp eq i32 %u, 0
91 tail call void @llvm.assume(i1 %cmp)
92 %cmp.1 = icmp ugt i32 %num, 5
93 tail call void @llvm.assume(i1 %cmp.1)
97 %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
98 %inc = add nuw nsw i32 %i.010, 1
99 %cmp2 = icmp ult i32 %inc, %num
100 br i1 %cmp2, label %for.body, label %exit
106 define void @test_trip_multiple_4_ugt_5_order_swapped(i32 %num) {
107 ; TODO: Trip multiple can be 4, it is missed due to the processing order of the assumes.
108 ; CHECK-LABEL: 'test_trip_multiple_4_ugt_5_order_swapped'
109 ; CHECK-NEXT: Classifying expressions for: @test_trip_multiple_4_ugt_5_order_swapped
110 ; CHECK-NEXT: %u = urem i32 %num, 4
111 ; CHECK-NEXT: --> (zext i2 (trunc i32 %num to i2) to i32) U: [0,4) S: [0,4)
112 ; CHECK-NEXT: %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
113 ; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%for.body> U: [0,-2147483648) S: [0,-2147483648) Exits: (-1 + %num) LoopDispositions: { %for.body: Computable }
114 ; CHECK-NEXT: %inc = add nuw nsw i32 %i.010, 1
115 ; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%for.body> U: [1,-2147483648) S: [1,-2147483648) Exits: %num LoopDispositions: { %for.body: Computable }
116 ; CHECK-NEXT: Determining loop execution counts for: @test_trip_multiple_4_ugt_5_order_swapped
117 ; CHECK-NEXT: Loop %for.body: backedge-taken count is (-1 + %num)
118 ; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i32 -2
119 ; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (-1 + %num)
120 ; CHECK-NEXT: Loop %for.body: Trip multiple is 4
123 %u = urem i32 %num, 4
124 %cmp.1 = icmp ugt i32 %num, 5
125 tail call void @llvm.assume(i1 %cmp.1)
126 %cmp = icmp eq i32 %u, 0
127 tail call void @llvm.assume(i1 %cmp)
131 %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
132 %inc = add nuw nsw i32 %i.010, 1
133 %cmp2 = icmp ult i32 %inc, %num
134 br i1 %cmp2, label %for.body, label %exit
140 define void @test_trip_multiple_4_sgt_5(i32 %num) {
141 ; CHECK-LABEL: 'test_trip_multiple_4_sgt_5'
142 ; CHECK-NEXT: Classifying expressions for: @test_trip_multiple_4_sgt_5
143 ; CHECK-NEXT: %u = urem i32 %num, 4
144 ; CHECK-NEXT: --> (zext i2 (trunc i32 %num to i2) to i32) U: [0,4) S: [0,4)
145 ; CHECK-NEXT: %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
146 ; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%for.body> U: [0,2147483647) S: [0,2147483647) Exits: (-1 + %num) LoopDispositions: { %for.body: Computable }
147 ; CHECK-NEXT: %inc = add nuw nsw i32 %i.010, 1
148 ; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%for.body> U: [1,-2147483648) S: [1,-2147483648) Exits: %num LoopDispositions: { %for.body: Computable }
149 ; CHECK-NEXT: Determining loop execution counts for: @test_trip_multiple_4_sgt_5
150 ; CHECK-NEXT: Loop %for.body: backedge-taken count is (-1 + %num)
151 ; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i32 2147483646
152 ; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (-1 + %num)
153 ; CHECK-NEXT: Loop %for.body: Trip multiple is 4
156 %u = urem i32 %num, 4
157 %cmp = icmp eq i32 %u, 0
158 tail call void @llvm.assume(i1 %cmp)
159 %cmp.1 = icmp sgt i32 %num, 5
160 tail call void @llvm.assume(i1 %cmp.1)
164 %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
165 %inc = add nuw nsw i32 %i.010, 1
166 %cmp2 = icmp slt i32 %inc, %num
167 br i1 %cmp2, label %for.body, label %exit
173 define void @test_trip_multiple_4_sgt_5_order_swapped(i32 %num) {
174 ; TODO: Trip multiple can be 4, it is missed due to the processing order of the assumes.
175 ; CHECK-LABEL: 'test_trip_multiple_4_sgt_5_order_swapped'
176 ; CHECK-NEXT: Classifying expressions for: @test_trip_multiple_4_sgt_5_order_swapped
177 ; CHECK-NEXT: %u = urem i32 %num, 4
178 ; CHECK-NEXT: --> (zext i2 (trunc i32 %num to i2) to i32) U: [0,4) S: [0,4)
179 ; CHECK-NEXT: %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
180 ; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%for.body> U: [0,2147483647) S: [0,2147483647) Exits: (-1 + %num) LoopDispositions: { %for.body: Computable }
181 ; CHECK-NEXT: %inc = add nuw nsw i32 %i.010, 1
182 ; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%for.body> U: [1,-2147483648) S: [1,-2147483648) Exits: %num LoopDispositions: { %for.body: Computable }
183 ; CHECK-NEXT: Determining loop execution counts for: @test_trip_multiple_4_sgt_5_order_swapped
184 ; CHECK-NEXT: Loop %for.body: backedge-taken count is (-1 + %num)
185 ; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i32 2147483646
186 ; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (-1 + %num)
187 ; CHECK-NEXT: Loop %for.body: Trip multiple is 4
190 %u = urem i32 %num, 4
191 %cmp.1 = icmp sgt i32 %num, 5
192 tail call void @llvm.assume(i1 %cmp.1)
193 %cmp = icmp eq i32 %u, 0
194 tail call void @llvm.assume(i1 %cmp)
198 %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
199 %inc = add nuw nsw i32 %i.010, 1
200 %cmp2 = icmp slt i32 %inc, %num
201 br i1 %cmp2, label %for.body, label %exit
207 define void @test_trip_multiple_4_uge_5(i32 %num) {
208 ; CHECK-LABEL: 'test_trip_multiple_4_uge_5'
209 ; CHECK-NEXT: Classifying expressions for: @test_trip_multiple_4_uge_5
210 ; CHECK-NEXT: %u = urem i32 %num, 4
211 ; CHECK-NEXT: --> (zext i2 (trunc i32 %num to i2) to i32) U: [0,4) S: [0,4)
212 ; CHECK-NEXT: %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
213 ; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%for.body> U: [0,-2147483648) S: [0,-2147483648) Exits: (-1 + %num) LoopDispositions: { %for.body: Computable }
214 ; CHECK-NEXT: %inc = add nuw nsw i32 %i.010, 1
215 ; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%for.body> U: [1,-2147483648) S: [1,-2147483648) Exits: %num LoopDispositions: { %for.body: Computable }
216 ; CHECK-NEXT: Determining loop execution counts for: @test_trip_multiple_4_uge_5
217 ; CHECK-NEXT: Loop %for.body: backedge-taken count is (-1 + %num)
218 ; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i32 -2
219 ; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (-1 + %num)
220 ; CHECK-NEXT: Loop %for.body: Trip multiple is 4
223 %u = urem i32 %num, 4
224 %cmp = icmp eq i32 %u, 0
225 tail call void @llvm.assume(i1 %cmp)
226 %cmp.1 = icmp uge i32 %num, 5
227 tail call void @llvm.assume(i1 %cmp.1)
231 %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
232 %inc = add nuw nsw i32 %i.010, 1
233 %cmp2 = icmp ult i32 %inc, %num
234 br i1 %cmp2, label %for.body, label %exit
240 define void @test_trip_multiple_4_uge_5_order_swapped(i32 %num) {
241 ; TODO: Trip multiple can be 4, it is missed due to the processing order of the assumes.
242 ; CHECK-LABEL: 'test_trip_multiple_4_uge_5_order_swapped'
243 ; CHECK-NEXT: Classifying expressions for: @test_trip_multiple_4_uge_5_order_swapped
244 ; CHECK-NEXT: %u = urem i32 %num, 4
245 ; CHECK-NEXT: --> (zext i2 (trunc i32 %num to i2) to i32) U: [0,4) S: [0,4)
246 ; CHECK-NEXT: %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
247 ; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%for.body> U: [0,-2147483648) S: [0,-2147483648) Exits: (-1 + %num) LoopDispositions: { %for.body: Computable }
248 ; CHECK-NEXT: %inc = add nuw nsw i32 %i.010, 1
249 ; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%for.body> U: [1,-2147483648) S: [1,-2147483648) Exits: %num LoopDispositions: { %for.body: Computable }
250 ; CHECK-NEXT: Determining loop execution counts for: @test_trip_multiple_4_uge_5_order_swapped
251 ; CHECK-NEXT: Loop %for.body: backedge-taken count is (-1 + %num)
252 ; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i32 -2
253 ; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (-1 + %num)
254 ; CHECK-NEXT: Loop %for.body: Trip multiple is 4
257 %u = urem i32 %num, 4
258 %cmp = icmp eq i32 %u, 0
259 %cmp.1 = icmp uge i32 %num, 5
260 tail call void @llvm.assume(i1 %cmp.1)
261 tail call void @llvm.assume(i1 %cmp)
265 %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
266 %inc = add nuw nsw i32 %i.010, 1
267 %cmp2 = icmp ult i32 %inc, %num
268 br i1 %cmp2, label %for.body, label %exit
274 define void @test_trip_multiple_4_sge_5(i32 %num) {
275 ; TODO: Trip multiple can be 4, it is missed due to the processing order of the assumes.
276 ; CHECK-LABEL: 'test_trip_multiple_4_sge_5'
277 ; CHECK-NEXT: Classifying expressions for: @test_trip_multiple_4_sge_5
278 ; CHECK-NEXT: %u = urem i32 %num, 4
279 ; CHECK-NEXT: --> (zext i2 (trunc i32 %num to i2) to i32) U: [0,4) S: [0,4)
280 ; CHECK-NEXT: %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
281 ; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%for.body> U: [0,2147483647) S: [0,2147483647) Exits: (-1 + %num) LoopDispositions: { %for.body: Computable }
282 ; CHECK-NEXT: %inc = add nuw nsw i32 %i.010, 1
283 ; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%for.body> U: [1,-2147483648) S: [1,-2147483648) Exits: %num LoopDispositions: { %for.body: Computable }
284 ; CHECK-NEXT: Determining loop execution counts for: @test_trip_multiple_4_sge_5
285 ; CHECK-NEXT: Loop %for.body: backedge-taken count is (-1 + %num)
286 ; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i32 2147483646
287 ; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (-1 + %num)
288 ; CHECK-NEXT: Loop %for.body: Trip multiple is 4
291 %u = urem i32 %num, 4
292 %cmp = icmp eq i32 %u, 0
293 tail call void @llvm.assume(i1 %cmp)
294 %cmp.1 = icmp sge i32 %num, 5
295 tail call void @llvm.assume(i1 %cmp.1)
299 %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
300 %inc = add nuw nsw i32 %i.010, 1
301 %cmp2 = icmp slt i32 %inc, %num
302 br i1 %cmp2, label %for.body, label %exit
308 define void @test_trip_multiple_4_sge_5_order_swapped(i32 %num) {
309 ; CHECK-LABEL: 'test_trip_multiple_4_sge_5_order_swapped'
310 ; CHECK-NEXT: Classifying expressions for: @test_trip_multiple_4_sge_5_order_swapped
311 ; CHECK-NEXT: %u = urem i32 %num, 4
312 ; CHECK-NEXT: --> (zext i2 (trunc i32 %num to i2) to i32) U: [0,4) S: [0,4)
313 ; CHECK-NEXT: %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
314 ; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%for.body> U: [0,2147483647) S: [0,2147483647) Exits: (-1 + %num) LoopDispositions: { %for.body: Computable }
315 ; CHECK-NEXT: %inc = add nuw nsw i32 %i.010, 1
316 ; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%for.body> U: [1,-2147483648) S: [1,-2147483648) Exits: %num LoopDispositions: { %for.body: Computable }
317 ; CHECK-NEXT: Determining loop execution counts for: @test_trip_multiple_4_sge_5_order_swapped
318 ; CHECK-NEXT: Loop %for.body: backedge-taken count is (-1 + %num)
319 ; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i32 2147483646
320 ; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (-1 + %num)
321 ; CHECK-NEXT: Loop %for.body: Trip multiple is 4
324 %u = urem i32 %num, 4
325 %cmp = icmp eq i32 %u, 0
326 %cmp.1 = icmp sge i32 %num, 5
327 tail call void @llvm.assume(i1 %cmp.1)
328 tail call void @llvm.assume(i1 %cmp)
332 %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
333 %inc = add nuw nsw i32 %i.010, 1
334 %cmp2 = icmp slt i32 %inc, %num
335 br i1 %cmp2, label %for.body, label %exit
341 ; Same as @test_trip_multiple_4 but with the icmp operands swapped.
342 define void @test_trip_multiple_4_icmp_ops_swapped(i32 %num) {
343 ; CHECK-LABEL: 'test_trip_multiple_4_icmp_ops_swapped'
344 ; CHECK-NEXT: Classifying expressions for: @test_trip_multiple_4_icmp_ops_swapped
345 ; CHECK-NEXT: %u = urem i32 %num, 4
346 ; CHECK-NEXT: --> (zext i2 (trunc i32 %num to i2) to i32) U: [0,4) S: [0,4)
347 ; CHECK-NEXT: %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
348 ; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%for.body> U: [0,-2147483648) S: [0,-2147483648) Exits: (-1 + %num) LoopDispositions: { %for.body: Computable }
349 ; CHECK-NEXT: %inc = add nuw nsw i32 %i.010, 1
350 ; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%for.body> U: [1,-2147483648) S: [1,-2147483648) Exits: %num LoopDispositions: { %for.body: Computable }
351 ; CHECK-NEXT: Determining loop execution counts for: @test_trip_multiple_4_icmp_ops_swapped
352 ; CHECK-NEXT: Loop %for.body: backedge-taken count is (-1 + %num)
353 ; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i32 -2
354 ; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (-1 + %num)
355 ; CHECK-NEXT: Loop %for.body: Trip multiple is 4
358 %u = urem i32 %num, 4
359 %cmp = icmp eq i32 0, %u
360 tail call void @llvm.assume(i1 %cmp)
361 %cmp.1 = icmp uge i32 %num, 4
362 tail call void @llvm.assume(i1 %cmp.1)
366 %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
367 %inc = add nuw nsw i32 %i.010, 1
368 %cmp2 = icmp ult i32 %inc, %num
369 br i1 %cmp2, label %for.body, label %exit
375 define void @test_trip_multiple_4_upper_lower_bounds(i32 %num) {
376 ; CHECK-LABEL: 'test_trip_multiple_4_upper_lower_bounds'
377 ; CHECK-NEXT: Classifying expressions for: @test_trip_multiple_4_upper_lower_bounds
378 ; CHECK-NEXT: %u = urem i32 %num, 4
379 ; CHECK-NEXT: --> (zext i2 (trunc i32 %num to i2) to i32) U: [0,4) S: [0,4)
380 ; CHECK-NEXT: %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
381 ; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%for.body> U: [0,-2147483648) S: [0,-2147483648) Exits: (-1 + %num) LoopDispositions: { %for.body: Computable }
382 ; CHECK-NEXT: %inc = add nuw nsw i32 %i.010, 1
383 ; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%for.body> U: [1,-2147483648) S: [1,-2147483648) Exits: %num LoopDispositions: { %for.body: Computable }
384 ; CHECK-NEXT: Determining loop execution counts for: @test_trip_multiple_4_upper_lower_bounds
385 ; CHECK-NEXT: Loop %for.body: backedge-taken count is (-1 + %num)
386 ; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i32 -2
387 ; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (-1 + %num)
388 ; CHECK-NEXT: Loop %for.body: Trip multiple is 4
391 %cmp.1 = icmp uge i32 %num, 5
392 tail call void @llvm.assume(i1 %cmp.1)
393 %u = urem i32 %num, 4
394 %cmp = icmp eq i32 %u, 0
395 tail call void @llvm.assume(i1 %cmp)
396 %cmp.2 = icmp ult i32 %num, 59000
397 tail call void @llvm.assume(i1 %cmp.2)
401 %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
402 %inc = add nuw nsw i32 %i.010, 1
403 %cmp2 = icmp ult i32 %inc, %num
404 br i1 %cmp2, label %for.body, label %exit
410 define void @test_trip_multiple_4_upper_lower_bounds_swapped1(i32 %num) {
411 ; CHECK-LABEL: 'test_trip_multiple_4_upper_lower_bounds_swapped1'
412 ; CHECK-NEXT: Classifying expressions for: @test_trip_multiple_4_upper_lower_bounds_swapped1
413 ; CHECK-NEXT: %u = urem i32 %num, 4
414 ; CHECK-NEXT: --> (zext i2 (trunc i32 %num to i2) to i32) U: [0,4) S: [0,4)
415 ; CHECK-NEXT: %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
416 ; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%for.body> U: [0,-2147483648) S: [0,-2147483648) Exits: (-1 + %num) LoopDispositions: { %for.body: Computable }
417 ; CHECK-NEXT: %inc = add nuw nsw i32 %i.010, 1
418 ; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%for.body> U: [1,-2147483648) S: [1,-2147483648) Exits: %num LoopDispositions: { %for.body: Computable }
419 ; CHECK-NEXT: Determining loop execution counts for: @test_trip_multiple_4_upper_lower_bounds_swapped1
420 ; CHECK-NEXT: Loop %for.body: backedge-taken count is (-1 + %num)
421 ; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i32 -2
422 ; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (-1 + %num)
423 ; CHECK-NEXT: Loop %for.body: Trip multiple is 4
426 %cmp.1 = icmp uge i32 %num, 5
427 tail call void @llvm.assume(i1 %cmp.1)
428 %u = urem i32 %num, 4
429 %cmp = icmp eq i32 %u, 0
430 tail call void @llvm.assume(i1 %cmp)
431 %cmp.2 = icmp ult i32 %num, 59000
432 tail call void @llvm.assume(i1 %cmp.2)
436 %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
437 %inc = add nuw nsw i32 %i.010, 1
438 %cmp2 = icmp ult i32 %inc, %num
439 br i1 %cmp2, label %for.body, label %exit
445 define void @test_trip_multiple_4_upper_lower_bounds_swapped2(i32 %num) {
446 ; CHECK-LABEL: 'test_trip_multiple_4_upper_lower_bounds_swapped2'
447 ; CHECK-NEXT: Classifying expressions for: @test_trip_multiple_4_upper_lower_bounds_swapped2
448 ; CHECK-NEXT: %u = urem i32 %num, 4
449 ; CHECK-NEXT: --> (zext i2 (trunc i32 %num to i2) to i32) U: [0,4) S: [0,4)
450 ; CHECK-NEXT: %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
451 ; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%for.body> U: [0,-2147483648) S: [0,-2147483648) Exits: (-1 + %num) LoopDispositions: { %for.body: Computable }
452 ; CHECK-NEXT: %inc = add nuw nsw i32 %i.010, 1
453 ; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%for.body> U: [1,-2147483648) S: [1,-2147483648) Exits: %num LoopDispositions: { %for.body: Computable }
454 ; CHECK-NEXT: Determining loop execution counts for: @test_trip_multiple_4_upper_lower_bounds_swapped2
455 ; CHECK-NEXT: Loop %for.body: backedge-taken count is (-1 + %num)
456 ; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i32 -2
457 ; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (-1 + %num)
458 ; CHECK-NEXT: Loop %for.body: Trip multiple is 4
461 %cmp.1 = icmp uge i32 %num, 5
462 tail call void @llvm.assume(i1 %cmp.1)
463 %cmp.2 = icmp ult i32 %num, 59000
464 tail call void @llvm.assume(i1 %cmp.2)
465 %u = urem i32 %num, 4
466 %cmp = icmp eq i32 %u, 0
467 tail call void @llvm.assume(i1 %cmp)
471 %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
472 %inc = add nuw nsw i32 %i.010, 1
473 %cmp2 = icmp ult i32 %inc, %num
474 br i1 %cmp2, label %for.body, label %exit
480 define void @test_trip_multiple_5(i32 %num) {
481 ; CHECK-LABEL: 'test_trip_multiple_5'
482 ; CHECK-NEXT: Classifying expressions for: @test_trip_multiple_5
483 ; CHECK-NEXT: %u = urem i32 %num, 5
484 ; CHECK-NEXT: --> ((-5 * (%num /u 5)) + %num) U: full-set S: full-set
485 ; CHECK-NEXT: %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
486 ; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%for.body> U: [0,-2147483648) S: [0,-2147483648) Exits: (-1 + %num) LoopDispositions: { %for.body: Computable }
487 ; CHECK-NEXT: %inc = add nuw nsw i32 %i.010, 1
488 ; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%for.body> U: [1,-2147483648) S: [1,-2147483648) Exits: %num LoopDispositions: { %for.body: Computable }
489 ; CHECK-NEXT: Determining loop execution counts for: @test_trip_multiple_5
490 ; CHECK-NEXT: Loop %for.body: backedge-taken count is (-1 + %num)
491 ; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i32 -2
492 ; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (-1 + %num)
493 ; CHECK-NEXT: Loop %for.body: Trip multiple is 5
496 %u = urem i32 %num, 5
497 %cmp = icmp eq i32 %u, 0
498 tail call void @llvm.assume(i1 %cmp)
499 %cmp.1 = icmp uge i32 %num, 5
500 tail call void @llvm.assume(i1 %cmp.1)
504 %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
505 %inc = add nuw nsw i32 %i.010, 1
506 %cmp2 = icmp ult i32 %inc, %num
507 br i1 %cmp2, label %for.body, label %exit
513 define void @test_trunc_operand_larger_than_urem_expr(i64 %N) {
514 ; CHECK-LABEL: 'test_trunc_operand_larger_than_urem_expr'
515 ; CHECK-NEXT: Classifying expressions for: @test_trunc_operand_larger_than_urem_expr
516 ; CHECK-NEXT: %conv = trunc i64 %N to i32
517 ; CHECK-NEXT: --> (trunc i64 %N to i32) U: full-set S: full-set
518 ; CHECK-NEXT: %and = and i32 %conv, 1
519 ; CHECK-NEXT: --> (zext i1 (trunc i64 %N to i1) to i32) U: [0,2) S: [0,2)
520 ; CHECK-NEXT: %iv = phi i64 [ 0, %entry ], [ %iv.next, %for.body ]
521 ; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%for.body> U: [0,-9223372036854775808) S: [0,-9223372036854775808) Exits: (-1 + %N) LoopDispositions: { %for.body: Computable }
522 ; CHECK-NEXT: %iv.next = add nuw nsw i64 %iv, 1
523 ; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%for.body> U: [1,-9223372036854775808) S: [1,-9223372036854775808) Exits: %N LoopDispositions: { %for.body: Computable }
524 ; CHECK-NEXT: Determining loop execution counts for: @test_trunc_operand_larger_than_urem_expr
525 ; CHECK-NEXT: Loop %for.body: backedge-taken count is (-1 + %N)
526 ; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i64 -1
527 ; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (-1 + %N)
528 ; CHECK-NEXT: Loop %for.body: Trip multiple is 1
531 %conv = trunc i64 %N to i32
532 %and = and i32 %conv, 1
533 %cmp.pre = icmp eq i32 %and, 0
534 br i1 %cmp.pre, label %for.body, label %exit
537 %iv = phi i64 [ 0, %entry ], [ %iv.next, %for.body ]
538 %iv.next = add nuw nsw i64 %iv, 1
539 %cmp.1 = icmp ne i64 %iv.next, %N
540 br i1 %cmp.1, label %for.body, label %exit
546 ; TODO: Even though %num is known to divide by 4, and the loop's IV advances by 4, SCEV can't compute the trip count.
547 define void @test_trip_multiple_4_vectorized_iv(i32 %num) {
548 ; CHECK-LABEL: 'test_trip_multiple_4_vectorized_iv'
549 ; CHECK-NEXT: Classifying expressions for: @test_trip_multiple_4_vectorized_iv
550 ; CHECK-NEXT: %u = urem i32 %num, 4
551 ; CHECK-NEXT: --> (zext i2 (trunc i32 %num to i2) to i32) U: [0,4) S: [0,4)
552 ; CHECK-NEXT: %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
553 ; CHECK-NEXT: --> {0,+,4}<%for.body> U: [0,-3) S: [-2147483648,2147483645) Exits: <<Unknown>> LoopDispositions: { %for.body: Computable }
554 ; CHECK-NEXT: %inc = add i32 %i.010, 4
555 ; CHECK-NEXT: --> {4,+,4}<%for.body> U: [0,-3) S: [-2147483648,2147483645) Exits: <<Unknown>> LoopDispositions: { %for.body: Computable }
556 ; CHECK-NEXT: Determining loop execution counts for: @test_trip_multiple_4_vectorized_iv
557 ; CHECK-NEXT: Loop %for.body: Unpredictable backedge-taken count.
558 ; CHECK-NEXT: Loop %for.body: Unpredictable constant max backedge-taken count.
559 ; CHECK-NEXT: Loop %for.body: Unpredictable symbolic max backedge-taken count.
562 %u = urem i32 %num, 4
563 %cmp = icmp eq i32 %u, 0
564 tail call void @llvm.assume(i1 %cmp)
568 %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
569 %inc = add i32 %i.010, 4
570 %cmp2 = icmp ult i32 %inc, %num
571 br i1 %cmp2, label %for.body, label %exit
577 declare void @llvm.assume(i1)
578 declare void @llvm.experimental.guard(i1, ...)