[llvm] [LV] Support tail-folded epilogue loops (PR #208764)
David Sherwood via llvm-commits
llvm-commits at lists.llvm.org
Mon Sep 7 06:56:41 PDT 2026
================
@@ -5550,22 +5612,32 @@ void LoopVectorizationPlanner::plan(ElementCount UserVF, unsigned UserIC) {
// Collect the instructions (and their associated costs) that will be more
// profitable to scalarize.
CM.collectNonVectorizedAndSetWideningDecisions(UserVF);
- buildVPlans(*VPlan1, UserVF, UserVF);
- ElementCount EpilogueUserVF = EpilogueVectorizationForceVF;
- if (EpilogueUserVF.isVector() &&
- ElementCount::isKnownLT(EpilogueUserVF, UserVF)) {
- CM.collectNonVectorizedAndSetWideningDecisions(EpilogueUserVF);
- buildVPlans(*VPlan1, EpilogueUserVF, EpilogueUserVF);
- }
- if (!VPlans.empty() && VPlans.front()->getSingleVF() == UserVF) {
- // For scalar VF, skip VPlan cost check as VPlan cost is designed for
- // vector VFs only.
- if (UserVF.isScalar() ||
- cost(*VPlans.front(), UserVF, /*RU=*/nullptr).isValid()) {
- LLVM_DEBUG(dbgs() << "LV: Using user VF " << UserVF << ".\n");
- LLVM_DEBUG(printPlans(dbgs()));
- return;
+ // Build the main-loop VPlan firstly because if epilogue tail-folding is
+ // enabled, it will be built later, so we keep the epilogue vplans at the
+ // end.
+ buildVPlans(*VPlan1, UserVF, UserVF, CM);
+
+ // For scalar VF, skip VPlan cost check as VPlan cost is designed for
+ // vector VFs only.
+ if (!VPlans.empty() &&
+ (UserVF.isScalar() ||
+ cost(*VPlans.front(), UserVF, /*RU=*/nullptr, CM).isValid())) {
+ // Plan for epilogue only if we succeeded in building main loop vplan.
+
+ // Try to plan for tail-folded epilogue if it's enabled/doable,
+ // otherwise plan for unpredicated epilogue:
+ bool EpilogueTfPlanCreated = planForEpilogueTF();
+ if (!EpilogueTfPlanCreated) {
+ ElementCount EpilogueUserVF = EpilogueVectorizationForceVF;
----------------
david-arm wrote:
Sorry, what do you mean by `when we relax the feature`? Perhaps it's just personal preference, but I do think it would be nicer to just call a common `planForEpilogue` function that calls the code below for non-tail-folded epilogues, then continues with the rest of the code in `planForEpilogueTF` for the tail-folded case. It just keeps all the epilogue planning code in one, easy-to-find place.
https://github.com/llvm/llvm-project/pull/208764
More information about the llvm-commits
mailing list