Skip to content

Commit 095f8e0

Browse files
committed
[LV] Add more tests for finding the first-iv of argmin.
Adds more test coverage for #170223.
1 parent 2fb2d7e commit 095f8e0

File tree

2 files changed

+122
-37
lines changed

2 files changed

+122
-37
lines changed

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

Lines changed: 49 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,15 @@ define i64 @test_vectorize_select_smin_first_idx(ptr %src, i64 %n) {
99
; CHECK-NEXT: [[ENTRY:.*]]:
1010
; CHECK-NEXT: br label %[[LOOP:.*]]
1111
; CHECK: [[LOOP]]:
12-
; CHECK-NEXT: [[IV:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]
12+
; CHECK-NEXT: [[IV1:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]
1313
; CHECK-NEXT: [[MIN_IDX:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[MIN_IDX_NEXT:%.*]], %[[LOOP]] ]
1414
; CHECK-NEXT: [[MIN_VAL:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[MIN_VAL_NEXT:%.*]], %[[LOOP]] ]
15-
; CHECK-NEXT: [[GEP:%.*]] = getelementptr i64, ptr [[SRC]], i64 [[IV]]
16-
; CHECK-NEXT: [[L:%.*]] = load i64, ptr [[GEP]], align 4
15+
; CHECK-NEXT: [[GEP1:%.*]] = getelementptr i64, ptr [[SRC]], i64 [[IV1]]
16+
; CHECK-NEXT: [[L:%.*]] = load i64, ptr [[GEP1]], align 4
1717
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i64 [[MIN_VAL]], [[L]]
1818
; CHECK-NEXT: [[MIN_VAL_NEXT]] = tail call i64 @llvm.smin.i64(i64 [[MIN_VAL]], i64 [[L]])
19-
; CHECK-NEXT: [[MIN_IDX_NEXT]] = select i1 [[CMP]], i64 [[IV]], i64 [[MIN_IDX]]
20-
; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1
19+
; CHECK-NEXT: [[MIN_IDX_NEXT]] = select i1 [[CMP]], i64 [[IV1]], i64 [[MIN_IDX]]
20+
; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV1]], 1
2121
; CHECK-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i64 [[IV_NEXT]], [[N]]
2222
; CHECK-NEXT: br i1 [[EXITCOND_NOT]], label %[[EXIT:.*]], label %[[LOOP]]
2323
; CHECK: [[EXIT]]:
@@ -216,3 +216,47 @@ exit:
216216
%res = phi i32 [ %min.idx.next, %loop ]
217217
ret i32 %res
218218
}
219+
220+
define i64 @test_vectorize_select_smin_idx_iv_start_different(ptr %src, i64 %n) {
221+
; CHECK-LABEL: define i64 @test_vectorize_select_smin_idx_iv_start_different(
222+
; CHECK-SAME: ptr [[SRC:%.*]], i64 [[N:%.*]]) {
223+
; CHECK-NEXT: [[ENTRY:.*]]:
224+
; CHECK-NEXT: br label %[[LOOP:.*]]
225+
; CHECK: [[LOOP]]:
226+
; CHECK-NEXT: [[IV:%.*]] = phi i64 [ 20, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]
227+
; CHECK-NEXT: [[MIN_IDX:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[MIN_IDX_NEXT:%.*]], %[[LOOP]] ]
228+
; CHECK-NEXT: [[MIN_VAL:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[MIN_VAL_NEXT:%.*]], %[[LOOP]] ]
229+
; CHECK-NEXT: [[GEP:%.*]] = getelementptr i64, ptr [[SRC]], i64 [[IV]]
230+
; CHECK-NEXT: [[L:%.*]] = load i64, ptr [[GEP]], align 4
231+
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i64 [[MIN_VAL]], [[L]]
232+
; CHECK-NEXT: [[MIN_VAL_NEXT]] = tail call i64 @llvm.smin.i64(i64 [[MIN_VAL]], i64 [[L]])
233+
; CHECK-NEXT: [[MIN_IDX_NEXT]] = select i1 [[CMP]], i64 [[IV]], i64 [[MIN_IDX]]
234+
; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1
235+
; CHECK-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i64 [[IV_NEXT]], 1000
236+
; CHECK-NEXT: br i1 [[EXITCOND_NOT]], label %[[EXIT:.*]], label %[[LOOP]]
237+
; CHECK: [[EXIT]]:
238+
; CHECK-NEXT: [[RES:%.*]] = phi i64 [ [[MIN_IDX_NEXT]], %[[LOOP]] ]
239+
; CHECK-NEXT: ret i64 [[RES]]
240+
;
241+
entry:
242+
br label %loop
243+
244+
loop:
245+
%iv = phi i64 [ 20, %entry ], [ %iv.next, %loop ]
246+
%min.idx = phi i64 [ 0, %entry ], [ %min.idx.next, %loop ]
247+
%min.val = phi i64 [ 0, %entry ], [ %min.val.next, %loop ]
248+
%gep = getelementptr i64, ptr %src, i64 %iv
249+
%l = load i64, ptr %gep
250+
%cmp = icmp sgt i64 %min.val, %l
251+
%min.val.next = tail call i64 @llvm.smin.i64(i64 %min.val, i64 %l)
252+
%min.idx.next = select i1 %cmp, i64 %iv, i64 %min.idx
253+
%iv.next = add nuw nsw i64 %iv, 1
254+
%exitcond.not = icmp eq i64 %iv.next, 1000
255+
br i1 %exitcond.not, label %exit, label %loop
256+
257+
exit:
258+
%res = phi i64 [ %min.idx.next, %loop ]
259+
ret i64 %res
260+
}
261+
262+

0 commit comments

Comments
 (0)