Skip to content

Commit 62c50fd

Browse files
committed
[VPlan] Retrieve canonical IV directly in preparePlanForEpilogue (NFCI).
Move code handling canonical IV out of the loop, simplifying the loop body. Preparation for follow-up changes
1 parent fc6cc40 commit 62c50fd

File tree

1 file changed

+42
-45
lines changed

1 file changed

+42
-45
lines changed

llvm/lib/Transforms/Vectorize/LoopVectorize.cpp

Lines changed: 42 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -9521,55 +9521,52 @@ static SmallVector<Instruction *> preparePlanForEpilogueVectorLoop(
95219521
VPBasicBlock *Header = VectorLoop->getEntryBasicBlock();
95229522
Header->setName("vec.epilog.vector.body");
95239523

9524-
DenseMap<Value *, Value *> ToFrozen;
9525-
SmallVector<Instruction *> InstsToMove;
95269524
// Ensure that the start values for all header phi recipes are updated before
95279525
// vectorizing the epilogue loop.
9528-
for (VPRecipeBase &R : Header->phis()) {
9529-
if (auto *IV = dyn_cast<VPCanonicalIVPHIRecipe>(&R)) {
9530-
// When vectorizing the epilogue loop, the canonical induction start
9531-
// value needs to be changed from zero to the value after the main
9532-
// vector loop. Find the resume value created during execution of the main
9533-
// VPlan. It must be the first phi in the loop preheader.
9534-
// FIXME: Improve modeling for canonical IV start values in the epilogue
9535-
// loop.
9536-
using namespace llvm::PatternMatch;
9537-
PHINode *EPResumeVal = &*L->getLoopPreheader()->phis().begin();
9538-
for (Value *Inc : EPResumeVal->incoming_values()) {
9539-
if (match(Inc, m_SpecificInt(0)))
9540-
continue;
9541-
assert(!EPI.VectorTripCount &&
9542-
"Must only have a single non-zero incoming value");
9543-
EPI.VectorTripCount = Inc;
9544-
}
9545-
// If we didn't find a non-zero vector trip count, all incoming values
9546-
// must be zero, which also means the vector trip count is zero. Pick the
9547-
// first zero as vector trip count.
9548-
// TODO: We should not choose VF * UF so the main vector loop is known to
9549-
// be dead.
9550-
if (!EPI.VectorTripCount) {
9551-
assert(
9552-
EPResumeVal->getNumIncomingValues() > 0 &&
9553-
all_of(EPResumeVal->incoming_values(),
9554-
[](Value *Inc) { return match(Inc, m_SpecificInt(0)); }) &&
9555-
"all incoming values must be 0");
9556-
EPI.VectorTripCount = EPResumeVal->getOperand(0);
9557-
}
9558-
VPValue *VPV = Plan.getOrAddLiveIn(EPResumeVal);
9559-
assert(all_of(IV->users(),
9560-
[](const VPUser *U) {
9561-
return isa<VPScalarIVStepsRecipe>(U) ||
9562-
isa<VPDerivedIVRecipe>(U) ||
9563-
cast<VPRecipeBase>(U)->isScalarCast() ||
9564-
cast<VPInstruction>(U)->getOpcode() ==
9565-
Instruction::Add;
9566-
}) &&
9567-
"the canonical IV should only be used by its increment or "
9568-
"ScalarIVSteps when resetting the start value");
9569-
IV->setOperand(0, VPV);
9526+
VPCanonicalIVPHIRecipe *IV = Plan.getCanonicalIV();
9527+
// When vectorizing the epilogue loop, the canonical induction start
9528+
// value needs to be changed from zero to the value after the main
9529+
// vector loop. Find the resume value created during execution of the main
9530+
// VPlan. It must be the first phi in the loop preheader.
9531+
// FIXME: Improve modeling for canonical IV start values in the epilogue
9532+
// loop.
9533+
using namespace llvm::PatternMatch;
9534+
PHINode *EPResumeVal = &*L->getLoopPreheader()->phis().begin();
9535+
for (Value *Inc : EPResumeVal->incoming_values()) {
9536+
if (match(Inc, m_SpecificInt(0)))
95709537
continue;
9571-
}
9538+
assert(!EPI.VectorTripCount &&
9539+
"Must only have a single non-zero incoming value");
9540+
EPI.VectorTripCount = Inc;
9541+
}
9542+
// If we didn't find a non-zero vector trip count, all incoming values
9543+
// must be zero, which also means the vector trip count is zero. Pick the
9544+
// first zero as vector trip count.
9545+
// TODO: We should not choose VF * UF so the main vector loop is known to
9546+
// be dead.
9547+
if (!EPI.VectorTripCount) {
9548+
assert(EPResumeVal->getNumIncomingValues() > 0 &&
9549+
all_of(EPResumeVal->incoming_values(),
9550+
[](Value *Inc) { return match(Inc, m_SpecificInt(0)); }) &&
9551+
"all incoming values must be 0");
9552+
EPI.VectorTripCount = EPResumeVal->getOperand(0);
9553+
}
9554+
VPValue *VPV = Plan.getOrAddLiveIn(EPResumeVal);
9555+
assert(all_of(IV->users(),
9556+
[](const VPUser *U) {
9557+
return isa<VPScalarIVStepsRecipe>(U) ||
9558+
isa<VPDerivedIVRecipe>(U) ||
9559+
cast<VPRecipeBase>(U)->isScalarCast() ||
9560+
cast<VPInstruction>(U)->getOpcode() ==
9561+
Instruction::Add;
9562+
}) &&
9563+
"the canonical IV should only be used by its increment or "
9564+
"ScalarIVSteps when resetting the start value");
9565+
IV->setOperand(0, VPV);
95729566

9567+
DenseMap<Value *, Value *> ToFrozen;
9568+
SmallVector<Instruction *> InstsToMove;
9569+
for (VPRecipeBase &R : drop_begin(Header->phis())) {
95739570
Value *ResumeV = nullptr;
95749571
// TODO: Move setting of resume values to prepareToExecute.
95759572
if (auto *ReductionPhi = dyn_cast<VPReductionPHIRecipe>(&R)) {

0 commit comments

Comments
 (0)