[llvm] [LV] Move predication, early exit & region handling to VPlan0 (NFCI) (PR #185305)
via llvm-commits
llvm-commits at lists.llvm.org
Sun Mar 8 10:21:25 PDT 2026
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-vectorizers
Author: Florian Hahn (fhahn)
<details>
<summary>Changes</summary>
Move handleEarlyExits, predication and region creation to operate directly on VPlan0. This means they only have to run once, reducing compile time a bit; the relative order remains unchanged.
Introducing the regions at this point in particular unlocks performing more transforms once, on the initial VPlan, instead of running them for each VF.
Whether a scalar epilogue is required is still determined by legacy cost model, so we need to still account for that in the VF specific VPlan logic.
---
Full diff: https://github.com/llvm/llvm-project/pull/185305.diff
1 Files Affected:
- (modified) llvm/lib/Transforms/Vectorize/LoopVectorize.cpp (+18-13)
``````````diff
diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
index 420b111bafc72..58abd3e42c52c 100644
--- a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
+++ b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
@@ -8160,6 +8160,15 @@ void LoopVectorizationPlanner::buildVPlansWithVPRecipes(ElementCount MinVF,
CM.getInLoopReductions(), Hints.allowReordering());
VPlanTransforms::simplifyRecipes(*VPlan0);
+ VPlanTransforms::handleEarlyExits(*VPlan0, Legal->hasUncountableEarlyExit());
+ VPlanTransforms::addMiddleCheck(*VPlan0,
+ /*RequiresScalarEpilogueCheck=*/true,
+ CM.foldTailByMasking());
+ RUN_VPLAN_PASS_NO_VERIFY(VPlanTransforms::createLoopRegions, *VPlan0);
+ if (CM.foldTailByMasking())
+ RUN_VPLAN_PASS_NO_VERIFY(VPlanTransforms::foldTailByMasking, *VPlan0);
+ RUN_VPLAN_PASS_NO_VERIFY(VPlanTransforms::introduceMasksAndLinearize,
+ *VPlan0);
auto MaxVFTimes2 = MaxVF * 2;
for (ElementCount VF = MinVF; ElementCount::isKnownLT(VF, MaxVFTimes2);) {
@@ -8206,13 +8215,15 @@ VPlanPtr LoopVectorizationPlanner::tryToBuildVPlanWithVPRecipes(
return !CM.requiresScalarEpilogue(VF.isVector());
},
Range);
- VPlanTransforms::handleEarlyExits(*Plan, Legal->hasUncountableEarlyExit());
- VPlanTransforms::addMiddleCheck(*Plan, RequiresScalarEpilogueCheck,
- CM.foldTailByMasking());
-
- RUN_VPLAN_PASS_NO_VERIFY(VPlanTransforms::createLoopRegions, *Plan);
- if (CM.foldTailByMasking())
- RUN_VPLAN_PASS_NO_VERIFY(VPlanTransforms::foldTailByMasking, *Plan);
+ // Update the branch in the middle block if a scalar epilogue is required.
+ auto *MiddleVPBB = Plan->getMiddleBlock();
+ if (!RequiresScalarEpilogueCheck && MiddleVPBB->getNumSuccessors() == 2) {
+ auto *MiddleVPBB = Plan->getMiddleBlock();
+ auto *BranchOnCond = cast<VPInstruction>(MiddleVPBB->getTerminator());
+ assert(MiddleVPBB->getSuccessors()[1] == Plan->getScalarPreheader() &&
+ "second successor must be scalar preheader");
+ BranchOnCond->setOperand(0, Plan->getFalse());
+ }
// Don't use getDecisionAndClampRange here, because we don't know the UF
// so this function is better to be conservative, rather than to split
@@ -8264,11 +8275,6 @@ VPlanPtr LoopVectorizationPlanner::tryToBuildVPlanWithVPRecipes(
InterleaveGroups.insert(IG);
}
- // ---------------------------------------------------------------------------
- // Predicate and linearize the top-level loop region.
- // ---------------------------------------------------------------------------
- RUN_VPLAN_PASS_NO_VERIFY(VPlanTransforms::introduceMasksAndLinearize, *Plan);
-
// ---------------------------------------------------------------------------
// Construct wide recipes and apply predication for original scalar
// VPInstructions in the loop.
@@ -8281,7 +8287,6 @@ VPlanPtr LoopVectorizationPlanner::tryToBuildVPlanWithVPRecipes(
ReversePostOrderTraversal<VPBlockShallowTraversalWrapper<VPBlockBase *>> RPOT(
HeaderVPBB);
- auto *MiddleVPBB = Plan->getMiddleBlock();
VPBasicBlock::iterator MBIP = MiddleVPBB->getFirstNonPhi();
// Collect blocks that need predication for in-loop reduction recipes.
``````````
</details>
https://github.com/llvm/llvm-project/pull/185305
More information about the llvm-commits
mailing list