@@ -412,6 +412,139 @@ loop:
412
412
exit:
413
413
ret void
414
414
}
415
+
416
+ ; Test case to make sure that uses of versioned strides of type i1 are properly
417
+ ; extended. From https://github.com/llvm/llvm-project/issues/91369.
418
+ ; FIXME: Currently miscompiled.
419
+ define void @zext_of_i1_stride (i1 %g , ptr %dst ) mustprogress {
420
+ ; CHECK-LABEL: define void @zext_of_i1_stride(
421
+ ; CHECK-SAME: i1 [[G:%.*]], ptr [[DST:%.*]]) #[[ATTR0:[0-9]+]] {
422
+ ; CHECK-NEXT: entry:
423
+ ; CHECK-NEXT: [[G_16:%.*]] = zext i1 [[G]] to i16
424
+ ; CHECK-NEXT: [[G_64:%.*]] = zext i1 [[G]] to i64
425
+ ; CHECK-NEXT: [[TMP0:%.*]] = udiv i64 15, [[G_64]]
426
+ ; CHECK-NEXT: [[TMP1:%.*]] = add nuw nsw i64 [[TMP0]], 1
427
+ ; CHECK-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 [[TMP1]], 4
428
+ ; CHECK-NEXT: br i1 [[MIN_ITERS_CHECK]], label [[SCALAR_PH:%.*]], label [[VECTOR_SCEVCHECK:%.*]]
429
+ ; CHECK: vector.scevcheck:
430
+ ; CHECK-NEXT: [[IDENT_CHECK:%.*]] = icmp ne i1 [[G]], true
431
+ ; CHECK-NEXT: br i1 [[IDENT_CHECK]], label [[SCALAR_PH]], label [[VECTOR_PH:%.*]]
432
+ ; CHECK: vector.ph:
433
+ ; CHECK-NEXT: [[N_MOD_VF:%.*]] = urem i64 [[TMP1]], 4
434
+ ; CHECK-NEXT: [[N_VEC:%.*]] = sub i64 [[TMP1]], [[N_MOD_VF]]
435
+ ; CHECK-NEXT: [[IND_END:%.*]] = mul i64 [[N_VEC]], [[G_64]]
436
+ ; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
437
+ ; CHECK: vector.body:
438
+ ; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
439
+ ; CHECK-NEXT: [[OFFSET_IDX:%.*]] = mul i64 [[INDEX]], [[G_64]]
440
+ ; CHECK-NEXT: [[TMP2:%.*]] = mul i64 0, [[G_64]]
441
+ ; CHECK-NEXT: [[TMP3:%.*]] = add i64 [[OFFSET_IDX]], [[TMP2]]
442
+ ; CHECK-NEXT: [[TMP4:%.*]] = getelementptr inbounds i16, ptr [[DST]], i64 [[TMP3]]
443
+ ; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds i16, ptr [[TMP4]], i32 0
444
+ ; CHECK-NEXT: store <4 x i16> <i16 -1, i16 -1, i16 -1, i16 -1>, ptr [[TMP5]], align 2
445
+ ; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4
446
+ ; CHECK-NEXT: [[TMP6:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
447
+ ; CHECK-NEXT: br i1 [[TMP6]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP12:![0-9]+]]
448
+ ; CHECK: middle.block:
449
+ ; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i64 [[TMP1]], [[N_VEC]]
450
+ ; CHECK-NEXT: br i1 [[CMP_N]], label [[EXIT:%.*]], label [[SCALAR_PH]]
451
+ ; CHECK: scalar.ph:
452
+ ; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[IND_END]], [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY:%.*]] ], [ 0, [[VECTOR_SCEVCHECK]] ]
453
+ ; CHECK-NEXT: br label [[LOOP:%.*]]
454
+ ; CHECK: loop:
455
+ ; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]
456
+ ; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds i16, ptr [[DST]], i64 [[IV]]
457
+ ; CHECK-NEXT: store i16 [[G_16]], ptr [[GEP]], align 2
458
+ ; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], [[G_64]]
459
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i64 [[IV_NEXT]], 16
460
+ ; CHECK-NEXT: br i1 [[CMP]], label [[LOOP]], label [[EXIT]], !llvm.loop [[LOOP13:![0-9]+]]
461
+ ; CHECK: exit:
462
+ ; CHECK-NEXT: ret void
463
+ ;
464
+ entry:
465
+ %g.16 = zext i1 %g to i16
466
+ %g.64 = zext i1 %g to i64
467
+ br label %loop
468
+
469
+ loop:
470
+ %iv = phi i64 [ 0 , %entry ], [ %iv.next , %loop ]
471
+ %gep = getelementptr inbounds i16 , ptr %dst , i64 %iv
472
+ store i16 %g.16 , ptr %gep , align 2
473
+ %iv.next = add nuw nsw i64 %iv , %g.64
474
+ %cmp = icmp ult i64 %iv.next , 16
475
+ br i1 %cmp , label %loop , label %exit
476
+
477
+ exit:
478
+ ret void
479
+ }
480
+
481
+ ; Test case to make sure that uses of versioned strides of type i1 are properly
482
+ ; extended.
483
+ define void @sext_of_i1_stride (i1 %g , ptr %dst ) mustprogress {
484
+ ; CHECK-LABEL: define void @sext_of_i1_stride(
485
+ ; CHECK-SAME: i1 [[G:%.*]], ptr [[DST:%.*]]) #[[ATTR0]] {
486
+ ; CHECK-NEXT: entry:
487
+ ; CHECK-NEXT: [[G_16:%.*]] = sext i1 [[G]] to i16
488
+ ; CHECK-NEXT: [[G_64:%.*]] = sext i1 [[G]] to i64
489
+ ; CHECK-NEXT: [[UMAX:%.*]] = call i64 @llvm.umax.i64(i64 [[G_64]], i64 16)
490
+ ; CHECK-NEXT: [[TMP0:%.*]] = add i64 [[UMAX]], -1
491
+ ; CHECK-NEXT: [[TMP1:%.*]] = udiv i64 [[TMP0]], [[G_64]]
492
+ ; CHECK-NEXT: [[TMP2:%.*]] = add nuw nsw i64 [[TMP1]], 1
493
+ ; CHECK-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 [[TMP2]], 4
494
+ ; CHECK-NEXT: br i1 [[MIN_ITERS_CHECK]], label [[SCALAR_PH:%.*]], label [[VECTOR_SCEVCHECK:%.*]]
495
+ ; CHECK: vector.scevcheck:
496
+ ; CHECK-NEXT: [[IDENT_CHECK:%.*]] = icmp ne i1 [[G]], true
497
+ ; CHECK-NEXT: br i1 [[IDENT_CHECK]], label [[SCALAR_PH]], label [[VECTOR_PH:%.*]]
498
+ ; CHECK: vector.ph:
499
+ ; CHECK-NEXT: [[N_MOD_VF:%.*]] = urem i64 [[TMP2]], 4
500
+ ; CHECK-NEXT: [[N_VEC:%.*]] = sub i64 [[TMP2]], [[N_MOD_VF]]
501
+ ; CHECK-NEXT: [[IND_END:%.*]] = mul i64 [[N_VEC]], [[G_64]]
502
+ ; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
503
+ ; CHECK: vector.body:
504
+ ; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
505
+ ; CHECK-NEXT: [[OFFSET_IDX:%.*]] = mul i64 [[INDEX]], [[G_64]]
506
+ ; CHECK-NEXT: [[TMP3:%.*]] = mul i64 0, [[G_64]]
507
+ ; CHECK-NEXT: [[TMP4:%.*]] = add i64 [[OFFSET_IDX]], [[TMP3]]
508
+ ; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds i16, ptr [[DST]], i64 [[TMP4]]
509
+ ; CHECK-NEXT: [[TMP6:%.*]] = getelementptr inbounds i16, ptr [[TMP5]], i32 0
510
+ ; CHECK-NEXT: [[TMP7:%.*]] = getelementptr inbounds i16, ptr [[TMP6]], i32 -3
511
+ ; CHECK-NEXT: store <4 x i16> <i16 -1, i16 -1, i16 -1, i16 -1>, ptr [[TMP7]], align 2
512
+ ; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4
513
+ ; CHECK-NEXT: br i1 true, label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP14:![0-9]+]]
514
+ ; CHECK: middle.block:
515
+ ; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i64 [[TMP2]], [[N_VEC]]
516
+ ; CHECK-NEXT: br i1 [[CMP_N]], label [[EXIT:%.*]], label [[SCALAR_PH]]
517
+ ; CHECK: scalar.ph:
518
+ ; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[IND_END]], [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY:%.*]] ], [ 0, [[VECTOR_SCEVCHECK]] ]
519
+ ; CHECK-NEXT: br label [[LOOP:%.*]]
520
+ ; CHECK: loop:
521
+ ; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]
522
+ ; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds i16, ptr [[DST]], i64 [[IV]]
523
+ ; CHECK-NEXT: store i16 [[G_16]], ptr [[GEP]], align 2
524
+ ; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], [[G_64]]
525
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i64 [[IV_NEXT]], 16
526
+ ; CHECK-NEXT: br i1 [[CMP]], label [[LOOP]], label [[EXIT]], !llvm.loop [[LOOP15:![0-9]+]]
527
+ ; CHECK: exit:
528
+ ; CHECK-NEXT: ret void
529
+ ;
530
+ entry:
531
+ %g.16 = sext i1 %g to i16
532
+ %g.64 = sext i1 %g to i64
533
+ br label %loop
534
+
535
+ loop:
536
+ %iv = phi i64 [ 0 , %entry ], [ %iv.next , %loop ]
537
+ %gep = getelementptr inbounds i16 , ptr %dst , i64 %iv
538
+ store i16 %g.16 , ptr %gep , align 2
539
+ %iv.next = add nuw nsw i64 %iv , %g.64
540
+ %cmp = icmp ult i64 %iv.next , 16
541
+ br i1 %cmp , label %loop , label %exit
542
+
543
+ exit:
544
+ ret void
545
+ }
546
+
547
+
415
548
;.
416
549
; CHECK: [[LOOP0]] = distinct !{[[LOOP0]], [[META1:![0-9]+]], [[META2:![0-9]+]]}
417
550
; CHECK: [[META1]] = !{!"llvm.loop.isvectorized", i32 1}
@@ -425,4 +558,8 @@ exit:
425
558
; CHECK: [[LOOP9]] = distinct !{[[LOOP9]], [[META1]]}
426
559
; CHECK: [[LOOP10]] = distinct !{[[LOOP10]], [[META1]], [[META2]]}
427
560
; CHECK: [[LOOP11]] = distinct !{[[LOOP11]], [[META1]]}
561
+ ; CHECK: [[LOOP12]] = distinct !{[[LOOP12]], [[META1]], [[META2]]}
562
+ ; CHECK: [[LOOP13]] = distinct !{[[LOOP13]], [[META1]]}
563
+ ; CHECK: [[LOOP14]] = distinct !{[[LOOP14]], [[META1]], [[META2]]}
564
+ ; CHECK: [[LOOP15]] = distinct !{[[LOOP15]], [[META1]]}
428
565
;.
0 commit comments