@@ -20,6 +20,9 @@ define i32 @test_simple_case(i32 %start, i32 %len) {
20
20
; CHECK-NEXT: exit count for range_check_block: ***COULDNOTCOMPUTE***
21
21
; CHECK-NEXT: exit count for backedge: ***COULDNOTCOMPUTE***
22
22
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is -1
23
+ ; CHECK-NEXT: constant max exit count for loop: -1
24
+ ; CHECK-NEXT: constant max exit count for range_check_block: ***COULDNOTCOMPUTE***
25
+ ; CHECK-NEXT: constant max exit count for backedge: ***COULDNOTCOMPUTE***
23
26
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is %start
24
27
; CHECK-NEXT: symbolic max exit count for loop: %start
25
28
; CHECK-NEXT: symbolic max exit count for range_check_block: ***COULDNOTCOMPUTE***
@@ -80,6 +83,9 @@ define i32 @test_litter_conditions(i32 %start, i32 %len) {
80
83
; CHECK-NEXT: exit count for range_check_block: ***COULDNOTCOMPUTE***
81
84
; CHECK-NEXT: exit count for backedge: ***COULDNOTCOMPUTE***
82
85
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is -1
86
+ ; CHECK-NEXT: constant max exit count for loop: ***COULDNOTCOMPUTE***
87
+ ; CHECK-NEXT: constant max exit count for range_check_block: ***COULDNOTCOMPUTE***
88
+ ; CHECK-NEXT: constant max exit count for backedge: ***COULDNOTCOMPUTE***
83
89
; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
84
90
; CHECK-NEXT: symbolic max exit count for loop: ***COULDNOTCOMPUTE***
85
91
; CHECK-NEXT: symbolic max exit count for range_check_block: ***COULDNOTCOMPUTE***
@@ -144,6 +150,9 @@ define i32 @test_litter_conditions_bad_context(i32 %start, i32 %len) {
144
150
; CHECK-NEXT: exit count for range_check_block: ***COULDNOTCOMPUTE***
145
151
; CHECK-NEXT: exit count for backedge: ***COULDNOTCOMPUTE***
146
152
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is -1
153
+ ; CHECK-NEXT: constant max exit count for loop: ***COULDNOTCOMPUTE***
154
+ ; CHECK-NEXT: constant max exit count for range_check_block: ***COULDNOTCOMPUTE***
155
+ ; CHECK-NEXT: constant max exit count for backedge: ***COULDNOTCOMPUTE***
147
156
; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
148
157
; CHECK-NEXT: symbolic max exit count for loop: ***COULDNOTCOMPUTE***
149
158
; CHECK-NEXT: symbolic max exit count for range_check_block: ***COULDNOTCOMPUTE***
@@ -201,6 +210,8 @@ define i32 @test_and_conditions(i32 %start, i32 %len) {
201
210
; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE***
202
211
; CHECK-NEXT: exit count for backedge: ***COULDNOTCOMPUTE***
203
212
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is -1
213
+ ; CHECK-NEXT: constant max exit count for loop: ***COULDNOTCOMPUTE***
214
+ ; CHECK-NEXT: constant max exit count for backedge: ***COULDNOTCOMPUTE***
204
215
; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
205
216
; CHECK-NEXT: symbolic max exit count for loop: ***COULDNOTCOMPUTE***
206
217
; CHECK-NEXT: symbolic max exit count for backedge: ***COULDNOTCOMPUTE***
@@ -228,3 +239,99 @@ done:
228
239
failed:
229
240
ret i32 -3
230
241
}
242
+
243
+ define i32 @test_mixup_constant_symbolic (i32 %end , i32 %len ) {
244
+ ; CHECK-LABEL: 'test_mixup_constant_symbolic'
245
+ ; CHECK-NEXT: Classifying expressions for: @test_mixup_constant_symbolic
246
+ ; CHECK-NEXT: %iv = phi i32 [ 0, %entry ], [ %iv.next, %backedge ]
247
+ ; CHECK-NEXT: --> {0,+,1}<%loop> U: [0,1001) S: [0,1001) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
248
+ ; CHECK-NEXT: %iv.next = add i32 %iv, 1
249
+ ; CHECK-NEXT: --> {1,+,1}<%loop> U: [1,1002) S: [1,1002) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
250
+ ; CHECK-NEXT: %loop_cond = call i1 @cond()
251
+ ; CHECK-NEXT: --> %loop_cond U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
252
+ ; CHECK-NEXT: Determining loop execution counts for: @test_mixup_constant_symbolic
253
+ ; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count.
254
+ ; CHECK-NEXT: exit count for loop: %end
255
+ ; CHECK-NEXT: exit count for range_check_block: 1000
256
+ ; CHECK-NEXT: exit count for backedge: ***COULDNOTCOMPUTE***
257
+ ; CHECK-NEXT: Loop %loop: constant max backedge-taken count is 1000
258
+ ; CHECK-NEXT: constant max exit count for loop: -1
259
+ ; CHECK-NEXT: constant max exit count for range_check_block: 1000
260
+ ; CHECK-NEXT: constant max exit count for backedge: ***COULDNOTCOMPUTE***
261
+ ; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (1000 umin %end)
262
+ ; CHECK-NEXT: symbolic max exit count for loop: %end
263
+ ; CHECK-NEXT: symbolic max exit count for range_check_block: 1000
264
+ ; CHECK-NEXT: symbolic max exit count for backedge: ***COULDNOTCOMPUTE***
265
+ ; CHECK-NEXT: Loop %loop: Unpredictable predicated backedge-taken count.
266
+ ;
267
+ entry:
268
+ br label %loop
269
+
270
+ loop:
271
+ %iv = phi i32 [0 , %entry ], [%iv.next , %backedge ]
272
+ %zero_check = icmp ne i32 %iv , %end
273
+ br i1 %zero_check , label %range_check_block , label %failed_1
274
+
275
+ range_check_block:
276
+ %range_check = icmp ult i32 %iv , 1000
277
+ br i1 %range_check , label %backedge , label %failed_2
278
+
279
+ backedge:
280
+ %iv.next = add i32 %iv , 1
281
+ %loop_cond = call i1 @cond ()
282
+ br i1 %loop_cond , label %done , label %loop
283
+
284
+ done:
285
+ ret i32 %iv
286
+
287
+ failed_1:
288
+ ret i32 -1
289
+
290
+ failed_2:
291
+ ret i32 -2
292
+ }
293
+
294
+ define i32 @test_mixup_constant_symbolic_merged (i32 %end , i32 %len ) {
295
+ ; CHECK-LABEL: 'test_mixup_constant_symbolic_merged'
296
+ ; CHECK-NEXT: Classifying expressions for: @test_mixup_constant_symbolic_merged
297
+ ; CHECK-NEXT: %iv = phi i32 [ 0, %entry ], [ %iv.next, %backedge ]
298
+ ; CHECK-NEXT: --> {0,+,1}<%loop> U: [0,1001) S: [0,1001) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
299
+ ; CHECK-NEXT: %and = and i1 %zero_check, %range_check
300
+ ; CHECK-NEXT: --> (%range_check umin %zero_check) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
301
+ ; CHECK-NEXT: %iv.next = add i32 %iv, 1
302
+ ; CHECK-NEXT: --> {1,+,1}<%loop> U: [1,1002) S: [1,1002) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
303
+ ; CHECK-NEXT: %loop_cond = call i1 @cond()
304
+ ; CHECK-NEXT: --> %loop_cond U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
305
+ ; CHECK-NEXT: Determining loop execution counts for: @test_mixup_constant_symbolic_merged
306
+ ; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count.
307
+ ; CHECK-NEXT: exit count for loop: (1000 umin %end)
308
+ ; CHECK-NEXT: exit count for backedge: ***COULDNOTCOMPUTE***
309
+ ; CHECK-NEXT: Loop %loop: constant max backedge-taken count is 1000
310
+ ; CHECK-NEXT: constant max exit count for loop: 1000
311
+ ; CHECK-NEXT: constant max exit count for backedge: ***COULDNOTCOMPUTE***
312
+ ; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (1000 umin %end)
313
+ ; CHECK-NEXT: symbolic max exit count for loop: (1000 umin %end)
314
+ ; CHECK-NEXT: symbolic max exit count for backedge: ***COULDNOTCOMPUTE***
315
+ ; CHECK-NEXT: Loop %loop: Unpredictable predicated backedge-taken count.
316
+ ;
317
+ entry:
318
+ br label %loop
319
+
320
+ loop:
321
+ %iv = phi i32 [0 , %entry ], [%iv.next , %backedge ]
322
+ %zero_check = icmp ne i32 %iv , %end
323
+ %range_check = icmp ult i32 %iv , 1000
324
+ %and = and i1 %zero_check , %range_check
325
+ br i1 %and , label %backedge , label %failed_1
326
+
327
+ backedge:
328
+ %iv.next = add i32 %iv , 1
329
+ %loop_cond = call i1 @cond ()
330
+ br i1 %loop_cond , label %done , label %loop
331
+
332
+ done:
333
+ ret i32 %iv
334
+
335
+ failed_1:
336
+ ret i32 -1
337
+ }
0 commit comments