[llvm] [VPlan] Update scalar induction resume values in VPlan. (PR #110577)
Florian Hahn via llvm-commits
llvm-commits at lists.llvm.org
Thu Dec 5 14:56:40 PST 2024
================
@@ -7988,25 +8010,40 @@ EpilogueVectorizerEpilogueLoop::createEpilogueVectorizedLoopSkeleton(
Phi->removeIncomingValue(EPI.MemSafetyCheck);
}
- // Generate a resume induction for the vector epilogue and put it in the
- // vector epilogue preheader
+ // Try to re-use an existing resume phi if it matches the resume values for
+ // the canonical induction. Otherwise generate a resume phi for the canonical
+ // induction for the vector epilogue and put it in the vector epilogue
+ // preheader.
+ PHINode *EPResumeVal = nullptr;
Type *IdxTy = Legal->getWidestInductionType();
- PHINode *EPResumeVal = PHINode::Create(IdxTy, 2, "vec.epilog.resume.val");
- EPResumeVal->insertBefore(LoopVectorPreHeader->getFirstNonPHIIt());
- EPResumeVal->addIncoming(EPI.VectorTripCount, VecEpilogueIterationCountCheck);
- EPResumeVal->addIncoming(ConstantInt::get(IdxTy, 0),
- EPI.MainLoopIterationCountCheck);
+ Value *TC = EPI.VectorTripCount;
+ Constant *Init = ConstantInt::get(IdxTy, 0);
+
+ for (PHINode &P : LoopVectorPreHeader->phis()) {
+ if (P.getType() == IdxTy &&
+ P.getIncomingValueForBlock(VecEpilogueIterationCountCheck) == TC &&
+ P.getIncomingValueForBlock(EPI.MainLoopIterationCountCheck) == Init) {
+ EPResumeVal = &P;
+ EPResumeVal->setName("vec.epilog.resume.val");
+ break;
+ }
+ }
+ if (!EPResumeVal) {
+ EPResumeVal = PHINode::Create(IdxTy, 2, "vec.epilog.resume.val");
+ EPResumeVal->insertBefore(LoopVectorPreHeader->getFirstNonPHIIt());
+ EPResumeVal->addIncoming(TC, VecEpilogueIterationCountCheck);
+ EPResumeVal->addIncoming(Init, EPI.MainLoopIterationCountCheck);
+ }
// Generate induction resume values. These variables save the new starting
// indexes for the scalar loop. They are used to test if there are any tail
// iterations left once the vector loop has completed.
// Note that when the vectorized epilogue is skipped due to iteration count
// check, then the resume value for the induction variable comes from
- // the trip count of the main vector loop, hence passing the AdditionalBypass
- // argument.
- createInductionResumeValues(ExpandedSCEVs,
- {VecEpilogueIterationCountCheck,
- EPI.VectorTripCount} /* AdditionalBypass */);
+ // the trip count of the main vector loop, hence passing the
+ // AdditionalBypassValue argument.
+ createInductionResumeVPValues(
+ ExpandedSCEVs, EPI.VectorTripCount /* AdditionalBypassValue */);
----------------
fhahn wrote:
Done, thanks
https://github.com/llvm/llvm-project/pull/110577
More information about the llvm-commits
mailing list