@@ -228,3 +228,94 @@ done:
228
228
failed:
229
229
ret i32 -3
230
230
}
231
+
232
+ define i32 @test_mixup_constant_symbolic (i32 %end , i32 %len ) {
233
+ ; CHECK-LABEL: 'test_mixup_constant_symbolic'
234
+ ; CHECK-NEXT: Classifying expressions for: @test_mixup_constant_symbolic
235
+ ; CHECK-NEXT: %iv = phi i32 [ 0, %entry ], [ %iv.next, %backedge ]
236
+ ; CHECK-NEXT: --> {0,+,1}<%loop> U: [0,1001) S: [0,1001) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
237
+ ; CHECK-NEXT: %iv.next = add i32 %iv, 1
238
+ ; CHECK-NEXT: --> {1,+,1}<%loop> U: [1,1002) S: [1,1002) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
239
+ ; CHECK-NEXT: %loop_cond = call i1 @cond()
240
+ ; CHECK-NEXT: --> %loop_cond U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
241
+ ; CHECK-NEXT: Determining loop execution counts for: @test_mixup_constant_symbolic
242
+ ; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count.
243
+ ; CHECK-NEXT: exit count for loop: %end
244
+ ; CHECK-NEXT: exit count for range_check_block: 1000
245
+ ; CHECK-NEXT: exit count for backedge: ***COULDNOTCOMPUTE***
246
+ ; CHECK-NEXT: Loop %loop: constant max backedge-taken count is 1000
247
+ ; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (1000 umin %end)
248
+ ; CHECK-NEXT: symbolic max exit count for loop: %end
249
+ ; CHECK-NEXT: symbolic max exit count for range_check_block: 1000
250
+ ; CHECK-NEXT: symbolic max exit count for backedge: ***COULDNOTCOMPUTE***
251
+ ; CHECK-NEXT: Loop %loop: Unpredictable predicated backedge-taken count.
252
+ ;
253
+ entry:
254
+ br label %loop
255
+
256
+ loop:
257
+ %iv = phi i32 [0 , %entry ], [%iv.next , %backedge ]
258
+ %zero_check = icmp ne i32 %iv , %end
259
+ br i1 %zero_check , label %range_check_block , label %failed_1
260
+
261
+ range_check_block:
262
+ %range_check = icmp ult i32 %iv , 1000
263
+ br i1 %range_check , label %backedge , label %failed_2
264
+
265
+ backedge:
266
+ %iv.next = add i32 %iv , 1
267
+ %loop_cond = call i1 @cond ()
268
+ br i1 %loop_cond , label %done , label %loop
269
+
270
+ done:
271
+ ret i32 %iv
272
+
273
+ failed_1:
274
+ ret i32 -1
275
+
276
+ failed_2:
277
+ ret i32 -2
278
+ }
279
+
280
+ define i32 @test_mixup_constant_symbolic_merged (i32 %end , i32 %len ) {
281
+ ; CHECK-LABEL: 'test_mixup_constant_symbolic_merged'
282
+ ; CHECK-NEXT: Classifying expressions for: @test_mixup_constant_symbolic_merged
283
+ ; CHECK-NEXT: %iv = phi i32 [ 0, %entry ], [ %iv.next, %backedge ]
284
+ ; CHECK-NEXT: --> {0,+,1}<%loop> U: [0,1001) S: [0,1001) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
285
+ ; CHECK-NEXT: %and = and i1 %zero_check, %range_check
286
+ ; CHECK-NEXT: --> (%range_check umin %zero_check) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
287
+ ; CHECK-NEXT: %iv.next = add i32 %iv, 1
288
+ ; CHECK-NEXT: --> {1,+,1}<%loop> U: [1,1002) S: [1,1002) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
289
+ ; CHECK-NEXT: %loop_cond = call i1 @cond()
290
+ ; CHECK-NEXT: --> %loop_cond U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
291
+ ; CHECK-NEXT: Determining loop execution counts for: @test_mixup_constant_symbolic_merged
292
+ ; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count.
293
+ ; CHECK-NEXT: exit count for loop: (1000 umin %end)
294
+ ; CHECK-NEXT: exit count for backedge: ***COULDNOTCOMPUTE***
295
+ ; CHECK-NEXT: Loop %loop: constant max backedge-taken count is 1000
296
+ ; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (1000 umin %end)
297
+ ; CHECK-NEXT: symbolic max exit count for loop: (1000 umin %end)
298
+ ; CHECK-NEXT: symbolic max exit count for backedge: ***COULDNOTCOMPUTE***
299
+ ; CHECK-NEXT: Loop %loop: Unpredictable predicated backedge-taken count.
300
+ ;
301
+ entry:
302
+ br label %loop
303
+
304
+ loop:
305
+ %iv = phi i32 [0 , %entry ], [%iv.next , %backedge ]
306
+ %zero_check = icmp ne i32 %iv , %end
307
+ %range_check = icmp ult i32 %iv , 1000
308
+ %and = and i1 %zero_check , %range_check
309
+ br i1 %and , label %backedge , label %failed_1
310
+
311
+ backedge:
312
+ %iv.next = add i32 %iv , 1
313
+ %loop_cond = call i1 @cond ()
314
+ br i1 %loop_cond , label %done , label %loop
315
+
316
+ done:
317
+ ret i32 %iv
318
+
319
+ failed_1:
320
+ ret i32 -1
321
+ }
0 commit comments