@@ -250,3 +250,78 @@ loop:
250250exit:
251251 ret void
252252}
253+
254+ ; Test case for https://github.com/llvm/llvm-project/issues/151686.
255+ define i8 @multiple_inductions_start_at_0 () {
256+ ; CHECK-LABEL: @multiple_inductions_start_at_0(
257+ ; CHECK-NEXT: iter.check:
258+ ; CHECK-NEXT: br i1 false, label [[VEC_EPILOG_SCALAR_PH:%.*]], label [[VECTOR_MAIN_LOOP_ITER_CHECK:%.*]]
259+ ; CHECK: vector.main.loop.iter.check:
260+ ; CHECK-NEXT: br i1 false, label [[VEC_EPILOG_PH:%.*]], label [[VECTOR_PH:%.*]]
261+ ; CHECK: vector.ph:
262+ ; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
263+ ; CHECK: vector.body:
264+ ; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
265+ ; CHECK-NEXT: [[VEC_IND:%.*]] = phi <32 x i8> [ zeroinitializer, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[VECTOR_BODY]] ]
266+ ; CHECK-NEXT: [[STEP_ADD:%.*]] = add <32 x i8> [[VEC_IND]], zeroinitializer
267+ ; CHECK-NEXT: [[STEP_ADD_2:%.*]] = add <32 x i8> [[STEP_ADD]], zeroinitializer
268+ ; CHECK-NEXT: [[STEP_ADD_3:%.*]] = add <32 x i8> [[STEP_ADD_2]], zeroinitializer
269+ ; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 128
270+ ; CHECK-NEXT: [[VEC_IND_NEXT]] = add <32 x i8> [[STEP_ADD_3]], zeroinitializer
271+ ; CHECK-NEXT: [[TMP0:%.*]] = icmp eq i32 [[INDEX_NEXT]], 1024
272+ ; CHECK-NEXT: br i1 [[TMP0]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP8:![0-9]+]]
273+ ; CHECK: middle.block:
274+ ; CHECK-NEXT: [[TMP1:%.*]] = extractelement <32 x i8> [[STEP_ADD_3]], i32 31
275+ ; CHECK-NEXT: br i1 false, label [[EXIT:%.*]], label [[VEC_EPILOG_ITER_CHECK:%.*]]
276+ ; CHECK: vec.epilog.iter.check:
277+ ; CHECK-NEXT: br i1 false, label [[VEC_EPILOG_SCALAR_PH]], label [[VEC_EPILOG_PH]]
278+ ; CHECK: vec.epilog.ph:
279+ ; CHECK-NEXT: [[VEC_EPILOG_RESUME_VAL:%.*]] = phi i32 [ 1024, [[VEC_EPILOG_ITER_CHECK]] ], [ 0, [[VECTOR_MAIN_LOOP_ITER_CHECK]] ]
280+ ; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i32 [ 0, [[VEC_EPILOG_ITER_CHECK]] ], [ 0, [[VECTOR_MAIN_LOOP_ITER_CHECK]] ]
281+ ; CHECK-NEXT: [[TMP2:%.*]] = trunc i32 [[BC_RESUME_VAL]] to i8
282+ ; CHECK-NEXT: [[BROADCAST_SPLATINSERT:%.*]] = insertelement <4 x i8> poison, i8 [[TMP2]], i64 0
283+ ; CHECK-NEXT: [[BROADCAST_SPLAT:%.*]] = shufflevector <4 x i8> [[BROADCAST_SPLATINSERT]], <4 x i8> poison, <4 x i32> zeroinitializer
284+ ; CHECK-NEXT: [[INDUCTION:%.*]] = add <4 x i8> [[BROADCAST_SPLAT]], zeroinitializer
285+ ; CHECK-NEXT: br label [[VEC_EPILOG_VECTOR_BODY:%.*]]
286+ ; CHECK: vec.epilog.vector.body:
287+ ; CHECK-NEXT: [[INDEX1:%.*]] = phi i32 [ [[VEC_EPILOG_RESUME_VAL]], [[VEC_EPILOG_PH]] ], [ [[INDEX_NEXT3:%.*]], [[VEC_EPILOG_VECTOR_BODY]] ]
288+ ; CHECK-NEXT: [[VEC_IND2:%.*]] = phi <4 x i8> [ [[INDUCTION]], [[VEC_EPILOG_PH]] ], [ [[VEC_IND_NEXT4:%.*]], [[VEC_EPILOG_VECTOR_BODY]] ]
289+ ; CHECK-NEXT: [[INDEX_NEXT3]] = add nuw i32 [[INDEX1]], 4
290+ ; CHECK-NEXT: [[VEC_IND_NEXT4]] = add <4 x i8> [[VEC_IND2]], zeroinitializer
291+ ; CHECK-NEXT: [[TMP3:%.*]] = icmp eq i32 [[INDEX_NEXT3]], 1052
292+ ; CHECK-NEXT: br i1 [[TMP3]], label [[VEC_EPILOG_MIDDLE_BLOCK:%.*]], label [[VEC_EPILOG_VECTOR_BODY]], !llvm.loop [[LOOP9:![0-9]+]]
293+ ; CHECK: vec.epilog.middle.block:
294+ ; CHECK-NEXT: [[TMP4:%.*]] = extractelement <4 x i8> [[VEC_IND2]], i32 3
295+ ; CHECK-NEXT: br i1 true, label [[EXIT]], label [[VEC_EPILOG_SCALAR_PH]]
296+ ; CHECK: vec.epilog.scalar.ph:
297+ ; CHECK-NEXT: [[BC_RESUME_VAL5:%.*]] = phi i32 [ 1052, [[VEC_EPILOG_MIDDLE_BLOCK]] ], [ 1024, [[VEC_EPILOG_ITER_CHECK]] ], [ 0, [[ITER_CHECK:%.*]] ]
298+ ; CHECK-NEXT: [[BC_RESUME_VAL6:%.*]] = phi i32 [ -469762048, [[VEC_EPILOG_MIDDLE_BLOCK]] ], [ 0, [[VEC_EPILOG_ITER_CHECK]] ], [ 0, [[ITER_CHECK]] ]
299+ ; CHECK-NEXT: br label [[LOOP:%.*]]
300+ ; CHECK: loop:
301+ ; CHECK-NEXT: [[IV:%.*]] = phi i32 [ [[BC_RESUME_VAL5]], [[VEC_EPILOG_SCALAR_PH]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]
302+ ; CHECK-NEXT: [[IV_2:%.*]] = phi i32 [ [[BC_RESUME_VAL6]], [[VEC_EPILOG_SCALAR_PH]] ], [ [[ADD:%.*]], [[LOOP]] ]
303+ ; CHECK-NEXT: [[ADD]] = add i32 [[IV_2]], -16777216
304+ ; CHECK-NEXT: [[TRUNC:%.*]] = trunc i32 [[IV_2]] to i8
305+ ; CHECK-NEXT: [[IV_NEXT]] = add i32 [[IV]], 1
306+ ; CHECK-NEXT: [[EC:%.*]] = icmp ugt i32 [[IV]], 1050
307+ ; CHECK-NEXT: br i1 [[EC]], label [[EXIT]], label [[LOOP]], !llvm.loop [[LOOP10:![0-9]+]]
308+ ; CHECK: exit:
309+ ; CHECK-NEXT: [[RES:%.*]] = phi i8 [ [[TRUNC]], [[LOOP]] ], [ [[TMP1]], [[MIDDLE_BLOCK]] ], [ [[TMP4]], [[VEC_EPILOG_MIDDLE_BLOCK]] ]
310+ ; CHECK-NEXT: ret i8 [[RES]]
311+ ;
312+ entry:
313+ br label %loop
314+
315+ loop:
316+ %iv = phi i32 [ 0 , %entry ], [ %iv.next , %loop ]
317+ %iv.2 = phi i32 [ 0 , %entry ], [ %add , %loop ]
318+ %add = add i32 %iv.2 , -16777216
319+ %trunc = trunc i32 %iv.2 to i8
320+ %iv.next = add i32 %iv , 1
321+ %ec = icmp ugt i32 %iv , 1050
322+ br i1 %ec , label %exit , label %loop
323+
324+ exit:
325+ %res = phi i8 [ %trunc , %loop ]
326+ ret i8 %res
327+ }
0 commit comments