@@ -352,3 +352,103 @@ bb1: ; preds = %bb
352
352
bb15: ; preds = %bb15, %bb14
353
353
br label %bb15
354
354
}
355
+
356
+ %struct = type { i32 , i32 , float , float }
357
+
358
+ ; Some points we collected as candidates for runtime checks have been removed
359
+ ; before generating runtime checks. Make sure versioning is skipped.
360
+ define void @test_bounds_removed_before_runtime_checks (%struct * %A , i32** %B , i1 %c ) {
361
+ ; CHECK-LABEL: @test_bounds_removed_before_runtime_checks(
362
+ ; CHECK-NEXT: entry:
363
+ ; CHECK-NEXT: [[TMP11:%.*]] = getelementptr inbounds [[STRUCT:%.*]], %struct* [[A:%.*]], i64 0, i32 0
364
+ ; CHECK-NEXT: [[TMP12:%.*]] = getelementptr inbounds [[STRUCT]], %struct* [[A]], i64 0, i32 1
365
+ ; CHECK-NEXT: [[TMP0:%.*]] = bitcast i32* [[TMP11]] to <2 x i32>*
366
+ ; CHECK-NEXT: store <2 x i32> <i32 10, i32 300>, <2 x i32>* [[TMP0]], align 8
367
+ ; CHECK-NEXT: [[TMP13:%.*]] = load i32*, i32** [[B:%.*]], align 8
368
+ ; CHECK-NEXT: br i1 [[C:%.*]], label [[BB23:%.*]], label [[BB14:%.*]]
369
+ ; CHECK: bb14:
370
+ ; CHECK-NEXT: [[TMP15:%.*]] = sext i32 10 to i64
371
+ ; CHECK-NEXT: [[TMP16:%.*]] = add nsw i64 2, [[TMP15]]
372
+ ; CHECK-NEXT: [[TMP17:%.*]] = getelementptr inbounds i32, i32* [[TMP13]], i64 [[TMP16]]
373
+ ; CHECK-NEXT: [[TMP18:%.*]] = bitcast i32* [[TMP17]] to i8*
374
+ ; CHECK-NEXT: [[TMP19:%.*]] = getelementptr inbounds i8, i8* [[TMP18]], i64 3
375
+ ; CHECK-NEXT: [[TMP20:%.*]] = getelementptr inbounds [[STRUCT]], %struct* [[A]], i64 0, i32 2
376
+ ; CHECK-NEXT: store float 0.000000e+00, float* [[TMP20]], align 8
377
+ ; CHECK-NEXT: [[TMP21:%.*]] = load i8, i8* [[TMP19]], align 1
378
+ ; CHECK-NEXT: [[TMP22:%.*]] = getelementptr inbounds [[STRUCT]], %struct* [[A]], i64 0, i32 3
379
+ ; CHECK-NEXT: store float 0.000000e+00, float* [[TMP22]], align 4
380
+ ; CHECK-NEXT: br label [[BB23]]
381
+ ; CHECK: bb23:
382
+ ; CHECK-NEXT: ret void
383
+ ;
384
+ entry:
385
+ %tmp1 = fmul float 10 .0 , 20 .0
386
+ %tmp2 = fptosi float %tmp1 to i32
387
+ %tmp3 = fmul float 30 .0 , 20 .0
388
+ %tmp4 = fptosi float %tmp3 to i32
389
+ %tmp5 = icmp sgt i32 100 , %tmp2
390
+ %tmp6 = select i1 %tmp5 , i32 %tmp2 , i32 10
391
+ %tmp7 = select i1 false , i32 0 , i32 %tmp6
392
+ %tmp8 = icmp sgt i32 200 , %tmp4
393
+ %tmp9 = select i1 %tmp8 , i32 %tmp4 , i32 300
394
+ %tmp10 = select i1 false , i32 0 , i32 %tmp9
395
+ %tmp11 = getelementptr inbounds %struct , %struct* %A , i64 0 , i32 0
396
+ store i32 %tmp7 , i32* %tmp11 , align 8
397
+ %tmp12 = getelementptr inbounds %struct , %struct* %A , i64 0 , i32 1
398
+ store i32 %tmp10 , i32* %tmp12 , align 4
399
+ %tmp13 = load i32* , i32** %B , align 8
400
+ br i1 %c , label %bb23 , label %bb14
401
+
402
+ bb14:
403
+ %tmp15 = sext i32 %tmp7 to i64
404
+ %tmp16 = add nsw i64 2 , %tmp15
405
+ %tmp17 = getelementptr inbounds i32 , i32* %tmp13 , i64 %tmp16
406
+ %tmp18 = bitcast i32* %tmp17 to i8*
407
+ %tmp19 = getelementptr inbounds i8 , i8* %tmp18 , i64 3
408
+ %tmp20 = getelementptr inbounds %struct , %struct* %A , i64 0 , i32 2
409
+ store float 0 .0 , float * %tmp20 , align 8
410
+ %tmp21 = load i8 , i8* %tmp19 , align 1
411
+ %tmp22 = getelementptr inbounds %struct , %struct* %A , i64 0 , i32 3
412
+ store float 0 .0 , float * %tmp22 , align 4
413
+ br label %bb23
414
+
415
+ bb23:
416
+ ret void
417
+ }
418
+
419
+ ; In this test there's a single bound, do not generate runtime checks.
420
+ define void @single_membound (double * %arg , double * %arg1 , double %x ) {
421
+ ; CHECK-LABEL: @single_membound(
422
+ ; CHECK-NEXT: entry:
423
+ ; CHECK-NEXT: [[TMP:%.*]] = fsub double [[X:%.*]], 9.900000e+01
424
+ ; CHECK-NEXT: [[TMP9:%.*]] = getelementptr inbounds double, double* [[ARG:%.*]], i64 1
425
+ ; CHECK-NEXT: store double [[TMP]], double* [[TMP9]], align 8
426
+ ; CHECK-NEXT: [[TMP10:%.*]] = getelementptr inbounds double, double* [[ARG1:%.*]], i64 0
427
+ ; CHECK-NEXT: [[TMP12:%.*]] = load double, double* [[TMP10]], align 8
428
+ ; CHECK-NEXT: [[TMP13:%.*]] = fsub double 1.000000e+00, [[TMP12]]
429
+ ; CHECK-NEXT: [[TMP14:%.*]] = getelementptr inbounds double, double* [[ARG]], i64 2
430
+ ; CHECK-NEXT: br label [[BB15:%.*]]
431
+ ; CHECK: bb15:
432
+ ; CHECK-NEXT: [[TMP16:%.*]] = fmul double [[TMP]], 2.000000e+01
433
+ ; CHECK-NEXT: store double [[TMP16]], double* [[TMP9]], align 8
434
+ ; CHECK-NEXT: [[TMP17:%.*]] = fmul double [[TMP13]], 3.000000e+01
435
+ ; CHECK-NEXT: store double [[TMP17]], double* [[TMP14]], align 8
436
+ ; CHECK-NEXT: ret void
437
+ ;
438
+ entry:
439
+ %tmp = fsub double %x , 99 .0
440
+ %tmp9 = getelementptr inbounds double , double * %arg , i64 1
441
+ store double %tmp , double * %tmp9 , align 8
442
+ %tmp10 = getelementptr inbounds double , double * %arg1 , i64 0
443
+ %tmp12 = load double , double * %tmp10 , align 8
444
+ %tmp13 = fsub double 1 .0 , %tmp12
445
+ %tmp14 = getelementptr inbounds double , double * %arg , i64 2
446
+ br label %bb15
447
+
448
+ bb15:
449
+ %tmp16 = fmul double %tmp , 20 .0
450
+ store double %tmp16 , double * %tmp9 , align 8
451
+ %tmp17 = fmul double %tmp13 , 30 .0
452
+ store double %tmp17 , double * %tmp14 , align 8
453
+ ret void
454
+ }
0 commit comments