Skip to content

Commit 113e0c9

Browse files
committed
[LV] Add additional tests for argmin with find-first wrapping IV ranges.
Add test cases for upcoming argmin vectorization changes that have wrapping IV ranges.
1 parent f42e58f commit 113e0c9

File tree

1 file changed

+89
-0
lines changed

1 file changed

+89
-0
lines changed

llvm/test/Transforms/LoopVectorize/select-umin-first-index.ll

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,48 @@ exit:
4545
ret i64 %res
4646
}
4747

48+
define i64 @test_vectorize_select_umin_idx_signed_sentinel_possible(ptr %src, i64 %n) {
49+
; CHECK-LABEL: define i64 @test_vectorize_select_umin_idx_signed_sentinel_possible(
50+
; CHECK-SAME: ptr [[SRC:%.*]], i64 [[N:%.*]]) {
51+
; CHECK-NEXT: [[ENTRY:.*]]:
52+
; CHECK-NEXT: br label %[[LOOP:.*]]
53+
; CHECK: [[LOOP]]:
54+
; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[INDEX_NEXT:%.*]], %[[LOOP]] ]
55+
; CHECK-NEXT: [[MIN_IDX:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[MIN_IDX_NEXT:%.*]], %[[LOOP]] ]
56+
; CHECK-NEXT: [[MIN_VAL:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[MIN_VAL_NEXT:%.*]], %[[LOOP]] ]
57+
; CHECK-NEXT: [[TMP0:%.*]] = getelementptr i64, ptr [[SRC]], i64 [[INDEX]]
58+
; CHECK-NEXT: [[L:%.*]] = load i64, ptr [[TMP0]], align 4
59+
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i64 [[MIN_VAL]], [[L]]
60+
; CHECK-NEXT: [[MIN_VAL_NEXT]] = tail call i64 @llvm.umin.i64(i64 [[MIN_VAL]], i64 [[L]])
61+
; CHECK-NEXT: [[MIN_IDX_NEXT]] = select i1 [[CMP]], i64 [[INDEX]], i64 [[MIN_IDX]]
62+
; CHECK-NEXT: [[INDEX_NEXT]] = add nuw nsw i64 [[INDEX]], 1
63+
; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i64 [[INDEX_NEXT]], 100
64+
; CHECK-NEXT: br i1 [[TMP4]], label %[[EXIT:.*]], label %[[LOOP]]
65+
; CHECK: [[EXIT]]:
66+
; CHECK-NEXT: [[RDX_SELECT:%.*]] = phi i64 [ [[MIN_IDX_NEXT]], %[[LOOP]] ]
67+
; CHECK-NEXT: ret i64 [[RDX_SELECT]]
68+
;
69+
entry:
70+
br label %loop
71+
72+
loop:
73+
%iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
74+
%min.idx = phi i64 [ 0, %entry ], [ %min.idx.next, %loop ]
75+
%min.val = phi i64 [ 0, %entry ], [ %min.val.next, %loop ]
76+
%gep = getelementptr i64, ptr %src, i64 %iv
77+
%l = load i64, ptr %gep
78+
%cmp = icmp ugt i64 %min.val, %l
79+
%min.val.next = tail call i64 @llvm.umin.i64(i64 %min.val, i64 %l)
80+
%min.idx.next = select i1 %cmp, i64 %iv, i64 %min.idx
81+
%iv.next = add nuw nsw i64 %iv, 1
82+
%exitcond.not = icmp eq i64 %iv.next, 100
83+
br i1 %exitcond.not, label %exit, label %loop
84+
85+
exit:
86+
%res = phi i64 [ %min.idx.next, %loop ]
87+
ret i64 %res
88+
}
89+
4890
define i64 @test_vectorize_select_umin_idx_cond_flipped(ptr %src, i64 %n) {
4991
; CHECK-LABEL: define i64 @test_vectorize_select_umin_idx_cond_flipped(
5092
; CHECK-SAME: ptr [[SRC:%.*]], i64 [[N:%.*]]) {
@@ -553,5 +595,52 @@ exit:
553595
ret i64 %res
554596
}
555597

598+
define i64 @test_vectorize_select_umin_idx_wraps(ptr %src, i64 %n, i64 %start) {
599+
; CHECK-LABEL: define i64 @test_vectorize_select_umin_idx_wraps(
600+
; CHECK-SAME: ptr [[SRC:%.*]], i64 [[N:%.*]], i64 [[START:%.*]]) {
601+
; CHECK-NEXT: [[ENTRY:.*]]:
602+
; CHECK-NEXT: br label %[[LOOP:.*]]
603+
; CHECK: [[LOOP]]:
604+
; CHECK-NEXT: [[IV:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]
605+
; CHECK-NEXT: [[IDX:%.*]] = phi i64 [ [[START]], %[[ENTRY]] ], [ [[IDX_NEXT:%.*]], %[[LOOP]] ]
606+
; CHECK-NEXT: [[MIN_IDX:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[MIN_IDX_NEXT:%.*]], %[[LOOP]] ]
607+
; CHECK-NEXT: [[MIN_VAL:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[MIN_VAL_NEXT:%.*]], %[[LOOP]] ]
608+
; CHECK-NEXT: [[GEP:%.*]] = getelementptr i64, ptr [[SRC]], i64 [[IV]]
609+
; CHECK-NEXT: [[L:%.*]] = load i64, ptr [[GEP]], align 4
610+
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i64 [[MIN_VAL]], [[L]]
611+
; CHECK-NEXT: [[MIN_VAL_NEXT]] = tail call i64 @llvm.umin.i64(i64 [[MIN_VAL]], i64 [[L]])
612+
; CHECK-NEXT: [[MIN_IDX_NEXT]] = select i1 [[CMP]], i64 [[IDX]], i64 [[MIN_IDX]]
613+
; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1
614+
; CHECK-NEXT: [[IDX_NEXT]] = add i64 [[IDX]], 1
615+
; CHECK-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i64 [[IV_NEXT]], [[N]]
616+
; CHECK-NEXT: br i1 [[EXITCOND_NOT]], label %[[EXIT:.*]], label %[[LOOP]]
617+
; CHECK: [[EXIT]]:
618+
; CHECK-NEXT: [[RES:%.*]] = phi i64 [ [[MIN_IDX_NEXT]], %[[LOOP]] ]
619+
; CHECK-NEXT: ret i64 [[RES]]
620+
;
621+
entry:
622+
br label %loop
623+
624+
loop:
625+
%iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
626+
%idx = phi i64 [ %start, %entry ], [ %idx.next, %loop ]
627+
%min.idx = phi i64 [ 0, %entry ], [ %min.idx.next, %loop ]
628+
%min.val = phi i64 [ 0, %entry ], [ %min.val.next, %loop ]
629+
%gep = getelementptr i64, ptr %src, i64 %iv
630+
%l = load i64, ptr %gep
631+
%cmp = icmp ugt i64 %min.val, %l
632+
%min.val.next = tail call i64 @llvm.umin.i64(i64 %min.val, i64 %l)
633+
%min.idx.next = select i1 %cmp, i64 %idx, i64 %min.idx
634+
%iv.next = add nuw nsw i64 %iv, 1
635+
%idx.next = add i64 %idx, 1
636+
%exitcond.not = icmp eq i64 %iv.next, %n
637+
br i1 %exitcond.not, label %exit, label %loop
638+
639+
exit:
640+
%res = phi i64 [ %min.idx.next, %loop ]
641+
ret i64 %res
642+
}
643+
644+
556645
declare i64 @llvm.umin.i64(i64, i64)
557646
declare i16 @llvm.umin.i16(i16, i16)

0 commit comments

Comments
 (0)