@@ -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