Skip to content

Commit c76ccf0

Browse files
committed
[LV] Add test case for #91369.
Add tests for #91369.
1 parent 65e2fab commit c76ccf0

File tree

1 file changed

+137
-0
lines changed

1 file changed

+137
-0
lines changed

llvm/test/Transforms/LoopVectorize/version-stride-with-integer-casts.ll

Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -412,6 +412,139 @@ loop:
412412
exit:
413413
ret void
414414
}
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+
415548
;.
416549
; CHECK: [[LOOP0]] = distinct !{[[LOOP0]], [[META1:![0-9]+]], [[META2:![0-9]+]]}
417550
; CHECK: [[META1]] = !{!"llvm.loop.isvectorized", i32 1}
@@ -425,4 +558,8 @@ exit:
425558
; CHECK: [[LOOP9]] = distinct !{[[LOOP9]], [[META1]]}
426559
; CHECK: [[LOOP10]] = distinct !{[[LOOP10]], [[META1]], [[META2]]}
427560
; 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]]}
428565
;.

0 commit comments

Comments
 (0)