Skip to content

Commit eee9755

Browse files
committed
[LV] Refine check to find epilogue IV resume value.
Make sure to check that the vector trip count is containedin the list of incoming values to serve as tie-breaker with phis with all-zero incoming values. Fixes #151686.
1 parent 55c2b27 commit eee9755

File tree

2 files changed

+79
-0
lines changed

2 files changed

+79
-0
lines changed

llvm/lib/Transforms/Vectorize/LoopVectorize.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9788,6 +9788,10 @@ preparePlanForEpilogueVectorLoop(VPlan &Plan, Loop *L,
97889788
match(
97899789
P.getIncomingValueForBlock(EPI.MainLoopIterationCountCheck),
97909790
m_SpecificInt(0)) &&
9791+
any_of(P.incoming_values(),
9792+
[&EPI](Value *Inc) {
9793+
return Inc == EPI.VectorTripCount;
9794+
}) &&
97919795
all_of(P.incoming_values(), [&EPI](Value *Inc) {
97929796
return Inc == EPI.VectorTripCount ||
97939797
match(Inc, m_SpecificInt(0));

llvm/test/Transforms/LoopVectorize/X86/epilog-vectorization-inductions.ll

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,3 +250,78 @@ loop:
250250
exit:
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

Comments
 (0)