@@ -250,3 +250,78 @@ loop:
250
250
exit:
251
251
ret void
252
252
}
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