[llvm] [VPlan] Unify inner and outer loop paths (NFCI). (PR #192868)
Ramkumar Ramachandra via llvm-commits
llvm-commits at lists.llvm.org
Sun Apr 19 13:20:18 PDT 2026
================
@@ -7707,40 +7704,58 @@ void LoopVectorizationPlanner::buildVPlansWithVPRecipes(ElementCount MinVF,
RUN_VPLAN_PASS(VPlanTransforms::createLoopRegions, *VPlan0);
if (CM.foldTailByMasking())
RUN_VPLAN_PASS(VPlanTransforms::foldTailByMasking, *VPlan0);
- RUN_VPLAN_PASS(VPlanTransforms::introduceMasksAndLinearize, *VPlan0);
+ // introduceMasksAndLinearize does not support nested loop regions yet.
+ if (IsInnerLoop)
+ RUN_VPLAN_PASS(VPlanTransforms::introduceMasksAndLinearize, *VPlan0);
auto MaxVFTimes2 = MaxVF * 2;
for (ElementCount VF = MinVF; ElementCount::isKnownLT(VF, MaxVFTimes2);) {
VFRange SubRange = {VF, MaxVFTimes2};
- if (auto Plan = tryToBuildVPlanWithVPRecipes(
- std::unique_ptr<VPlan>(VPlan0->duplicate()), SubRange, &LVer)) {
- // Now optimize the initial VPlan.
- VPlanTransforms::hoistPredicatedLoads(*Plan, PSE, OrigLoop);
- VPlanTransforms::sinkPredicatedStores(*Plan, PSE, OrigLoop);
- RUN_VPLAN_PASS(VPlanTransforms::truncateToMinimalBitwidths, *Plan,
- CM.getMinimalBitwidths());
- RUN_VPLAN_PASS(VPlanTransforms::optimize, *Plan);
- // TODO: try to put addExplicitVectorLength close to addActiveLaneMask
- if (CM.foldTailWithEVL()) {
- RUN_VPLAN_PASS(VPlanTransforms::addExplicitVectorLength, *Plan,
- CM.getMaxSafeElements());
- RUN_VPLAN_PASS(VPlanTransforms::optimizeEVLMasks, *Plan);
- }
+ auto Plan = tryToBuildVPlanWithVPRecipes(
+ std::unique_ptr<VPlan>(VPlan0->duplicate()), SubRange,
+ LVer ? &*LVer : nullptr);
+ VF = SubRange.End;
- if (auto P = VPlanTransforms::narrowInterleaveGroups(*Plan, TTI))
- VPlans.push_back(std::move(P));
+ if (!Plan)
+ continue;
- RUN_VPLAN_PASS_NO_VERIFY(printOptimizedVPlan, *Plan);
- assert(verifyVPlanIsValid(*Plan) && "VPlan is invalid");
- VPlans.push_back(std::move(Plan));
+ VPlanTransforms::hoistPredicatedLoads(*Plan, PSE, OrigLoop);
+ VPlanTransforms::sinkPredicatedStores(*Plan, PSE, OrigLoop);
+ RUN_VPLAN_PASS(VPlanTransforms::truncateToMinimalBitwidths, *Plan,
+ CM.getMinimalBitwidths());
+ RUN_VPLAN_PASS(VPlanTransforms::optimize, *Plan);
+ // TODO: try to put addExplicitVectorLength close to addActiveLaneMask
+ if (CM.foldTailWithEVL()) {
+ RUN_VPLAN_PASS(VPlanTransforms::addExplicitVectorLength, *Plan,
+ CM.getMaxSafeElements());
+ RUN_VPLAN_PASS(VPlanTransforms::optimizeEVLMasks, *Plan);
}
- VF = SubRange.End;
+
+ if (auto P = VPlanTransforms::narrowInterleaveGroups(*Plan, TTI))
+ VPlans.push_back(std::move(P));
+
+ RUN_VPLAN_PASS_NO_VERIFY(printOptimizedVPlan, *Plan);
+ assert(verifyVPlanIsValid(*Plan) && "VPlan is invalid");
+ VPlans.push_back(std::move(Plan));
}
}
VPlanPtr LoopVectorizationPlanner::tryToBuildVPlanWithVPRecipes(
----------------
artagnon wrote:
```suggestion
VPlanPtr LoopVectorizationPlanner::tryToBuildVPlan(
```
to match buildVPlans?
https://github.com/llvm/llvm-project/pull/192868
More information about the llvm-commits
mailing list