Skip to content

Commit 88d3ef9

Browse files
committed
[VPlan] Simplify VPPhi with all-equal incoming
1 parent 019913e commit 88d3ef9

File tree

7 files changed

+18
-29
lines changed

7 files changed

+18
-29
lines changed

llvm/lib/Transforms/Vectorize/LoopVectorize.cpp

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9629,6 +9629,16 @@ preparePlanForEpilogueVectorLoop(VPlan &Plan, Loop *L,
96299629
// vectorizing the epilogue loop.
96309630
for (VPRecipeBase &R : Header->phis()) {
96319631
if (auto *IV = dyn_cast<VPCanonicalIVPHIRecipe>(&R)) {
9632+
// If we didn't find any PHIs, due to a simplification where all incoming
9633+
// values were equal (and necessarily zero), it means that the vector trip
9634+
// count is zero.
9635+
// TODO: We should not choose VF * UF so the main vector loop is known to
9636+
// be dead.
9637+
if (L->getLoopPreheader()->phis().empty()) {
9638+
EPI.VectorTripCount = ConstantInt::get(IV->getScalarType(), 0);
9639+
continue;
9640+
}
9641+
96329642
// When vectorizing the epilogue loop, the canonical induction start
96339643
// value needs to be changed from zero to the value after the main
96349644
// vector loop. Find the resume value created during execution of the main
@@ -9644,19 +9654,7 @@ preparePlanForEpilogueVectorLoop(VPlan &Plan, Loop *L,
96449654
"Must only have a single non-zero incoming value");
96459655
EPI.VectorTripCount = Inc;
96469656
}
9647-
// If we didn't find a non-zero vector trip count, all incoming values
9648-
// must be zero, which also means the vector trip count is zero. Pick the
9649-
// first zero as vector trip count.
9650-
// TODO: We should not choose VF * UF so the main vector loop is known to
9651-
// be dead.
9652-
if (!EPI.VectorTripCount) {
9653-
assert(
9654-
EPResumeVal->getNumIncomingValues() > 0 &&
9655-
all_of(EPResumeVal->incoming_values(),
9656-
[](Value *Inc) { return match(Inc, m_SpecificInt(0)); }) &&
9657-
"all incoming values must be 0");
9658-
EPI.VectorTripCount = EPResumeVal->getOperand(0);
9659-
}
9657+
assert(EPI.VectorTripCount && "Must have an epilog vector trip-count");
96609658
VPValue *VPV = Plan.getOrAddLiveIn(EPResumeVal);
96619659
assert(all_of(IV->users(),
96629660
[](const VPUser *U) {

llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1225,8 +1225,8 @@ static void simplifyRecipe(VPRecipeBase &R, VPTypeAnalysis &TypeInfo) {
12251225
}
12261226

12271227
if (auto *Phi = dyn_cast<VPPhi>(Def)) {
1228-
if (Phi->getNumOperands() == 1)
1229-
Phi->replaceAllUsesWith(Phi->getOperand(0));
1228+
if (all_equal(Phi->incoming_values()))
1229+
Phi->replaceAllUsesWith(Phi->getIncomingValue(0));
12301230
return;
12311231
}
12321232

llvm/test/Transforms/LoopVectorize/AArch64/epilog-vectorization-factors.ll

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -374,10 +374,9 @@ define void @small_trip_count_loop(ptr %arg, ptr %arg2) {
374374
; CHECK: vec.epilog.iter.check:
375375
; CHECK-NEXT: br i1 false, label [[VEC_EPILOG_SCALAR_PH]], label [[VEC_EPILOG_PH]]
376376
; CHECK: vec.epilog.ph:
377-
; CHECK-NEXT: [[VEC_EPILOG_RESUME_VAL:%.*]] = phi i32 [ 0, [[VEC_EPILOG_ITER_CHECK]] ], [ 0, [[VECTOR_MAIN_LOOP_ITER_CHECK]] ]
378377
; CHECK-NEXT: br label [[VEC_EPILOG_VECTOR_BODY:%.*]]
379378
; CHECK: vec.epilog.vector.body:
380-
; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ [[VEC_EPILOG_RESUME_VAL]], [[VEC_EPILOG_PH]] ], [ [[INDEX_NEXT:%.*]], [[VEC_EPILOG_VECTOR_BODY]] ]
379+
; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, [[VEC_EPILOG_PH]] ], [ [[INDEX_NEXT:%.*]], [[VEC_EPILOG_VECTOR_BODY]] ]
381380
; CHECK-NEXT: [[TMP11:%.*]] = getelementptr inbounds i8, ptr [[ARG]], i32 [[INDEX]]
382381
; CHECK-NEXT: [[WIDE_LOAD7:%.*]] = load <16 x i8>, ptr [[TMP11]], align 1
383382
; CHECK-NEXT: [[TMP12:%.*]] = add <16 x i8> [[WIDE_LOAD7]], splat (i8 10)

llvm/test/Transforms/LoopVectorize/AArch64/predicated-costs.ll

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -268,10 +268,9 @@ define void @test_predicated_load_cast_hint(ptr %dst.1, ptr %dst.2, ptr %src, i8
268268
; CHECK: [[MIDDLE_BLOCK]]:
269269
; CHECK-NEXT: br label %[[EXIT:.*]]
270270
; CHECK: [[SCALAR_PH]]:
271-
; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i8 [ 0, %[[VECTOR_SCEVCHECK]] ], [ 0, %[[VECTOR_MEMCHECK]] ]
272271
; CHECK-NEXT: br label %[[LOOP:.*]]
273272
; CHECK: [[LOOP]]:
274-
; CHECK-NEXT: [[IV:%.*]] = phi i8 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]
273+
; CHECK-NEXT: [[IV:%.*]] = phi i8 [ 0, %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]
275274
; CHECK-NEXT: [[L:%.*]] = load i8, ptr [[SRC]], align 1
276275
; CHECK-NEXT: [[L_EXT:%.*]] = zext i8 [[L]] to i64
277276
; CHECK-NEXT: [[ADD:%.*]] = or i64 [[L_EXT]], 1

llvm/test/Transforms/LoopVectorize/RISCV/gather-scatter-cost.ll

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,9 @@ define void @predicated_uniform_load(ptr %src, i32 %n, ptr %dst, i1 %cond) {
4848
; CHECK: middle.block:
4949
; CHECK-NEXT: br label [[EXIT:%.*]]
5050
; CHECK: scalar.ph:
51-
; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i32 [ 0, [[VECTOR_SCEVCHECK]] ], [ 0, [[VECTOR_MEMCHECK]] ]
5251
; CHECK-NEXT: br label [[LOOP:%.*]]
5352
; CHECK: loop:
54-
; CHECK-NEXT: [[IV:%.*]] = phi i32 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]
53+
; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, [[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]
5554
; CHECK-NEXT: br i1 [[COND]], label [[LOOP_THEN:%.*]], label [[LOOP_ELSE:%.*]]
5655
; CHECK: loop.then:
5756
; CHECK-NEXT: br label [[LOOP_LATCH]]

llvm/test/Transforms/LoopVectorize/RISCV/riscv-vector-reverse.ll

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -242,8 +242,6 @@ define void @vector_reverse_i64(ptr nocapture noundef writeonly %A, ptr nocaptur
242242
; RV64: [[MIDDLE_BLOCK]]:
243243
; RV64-NEXT: br label %[[FOR_COND_CLEANUP_LOOPEXIT:.*]]
244244
; RV64: [[SCALAR_PH]]:
245-
; RV64-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[TMP0]], %[[VECTOR_SCEVCHECK]] ], [ [[TMP0]], %[[VECTOR_MEMCHECK]] ]
246-
; RV64-NEXT: [[BC_RESUME_VAL4:%.*]] = phi i32 [ [[N]], %[[VECTOR_SCEVCHECK]] ], [ [[N]], %[[VECTOR_MEMCHECK]] ]
247245
; RV64-NEXT: br label %[[FOR_BODY:.*]]
248246
; RV64: [[FOR_COND_CLEANUP_LOOPEXIT]]:
249247
; RV64-NEXT: br label %[[FOR_COND_CLEANUP]]
@@ -493,8 +491,6 @@ define void @vector_reverse_f32(ptr nocapture noundef writeonly %A, ptr nocaptur
493491
; RV64: [[MIDDLE_BLOCK]]:
494492
; RV64-NEXT: br label %[[FOR_COND_CLEANUP_LOOPEXIT:.*]]
495493
; RV64: [[SCALAR_PH]]:
496-
; RV64-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[TMP0]], %[[VECTOR_SCEVCHECK]] ], [ [[TMP0]], %[[VECTOR_MEMCHECK]] ]
497-
; RV64-NEXT: [[BC_RESUME_VAL4:%.*]] = phi i32 [ [[N]], %[[VECTOR_SCEVCHECK]] ], [ [[N]], %[[VECTOR_MEMCHECK]] ]
498494
; RV64-NEXT: br label %[[FOR_BODY:.*]]
499495
; RV64: [[FOR_COND_CLEANUP_LOOPEXIT]]:
500496
; RV64-NEXT: br label %[[FOR_COND_CLEANUP]]

llvm/test/Transforms/LoopVectorize/RISCV/strided-accesses.ll

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -684,10 +684,9 @@ define void @double_stride_int_scaled(ptr %p, ptr %p2, i64 %stride) {
684684
; NOSTRIDED: middle.block:
685685
; NOSTRIDED-NEXT: br label [[EXIT:%.*]]
686686
; NOSTRIDED: scalar.ph:
687-
; NOSTRIDED-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ 0, [[VECTOR_SCEVCHECK]] ], [ 0, [[VECTOR_MEMCHECK]] ]
688687
; NOSTRIDED-NEXT: br label [[LOOP:%.*]]
689688
; NOSTRIDED: loop:
690-
; NOSTRIDED-NEXT: [[I:%.*]] = phi i64 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[NEXTI:%.*]], [[LOOP]] ]
689+
; NOSTRIDED-NEXT: [[I:%.*]] = phi i64 [ 0, [[SCALAR_PH]] ], [ [[NEXTI:%.*]], [[LOOP]] ]
691690
; NOSTRIDED-NEXT: [[OFFSET:%.*]] = mul nuw nsw i64 [[I]], [[STRIDE]]
692691
; NOSTRIDED-NEXT: [[Q0:%.*]] = getelementptr i32, ptr [[P]], i64 [[OFFSET]]
693692
; NOSTRIDED-NEXT: [[X0:%.*]] = load i32, ptr [[Q0]], align 4
@@ -842,10 +841,9 @@ define void @double_stride_int_scaled(ptr %p, ptr %p2, i64 %stride) {
842841
; STRIDED: middle.block:
843842
; STRIDED-NEXT: br label [[EXIT:%.*]]
844843
; STRIDED: scalar.ph:
845-
; STRIDED-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ 0, [[VECTOR_SCEVCHECK]] ], [ 0, [[VECTOR_MEMCHECK1]] ]
846844
; STRIDED-NEXT: br label [[LOOP:%.*]]
847845
; STRIDED: loop:
848-
; STRIDED-NEXT: [[I:%.*]] = phi i64 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[NEXTI:%.*]], [[LOOP]] ]
846+
; STRIDED-NEXT: [[I:%.*]] = phi i64 [ 0, [[SCALAR_PH]] ], [ [[NEXTI:%.*]], [[LOOP]] ]
849847
; STRIDED-NEXT: [[OFFSET:%.*]] = mul nuw nsw i64 [[I]], [[STRIDE]]
850848
; STRIDED-NEXT: [[Q0:%.*]] = getelementptr i32, ptr [[P]], i64 [[OFFSET]]
851849
; STRIDED-NEXT: [[X0:%.*]] = load i32, ptr [[Q0]], align 4

0 commit comments

Comments
 (0)