[llvm] ea595eb - [VPlan] Run addMiddleCheck before early exit handling. NFC (#206244)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Jun 29 04:10:57 PDT 2026
Author: Luke Lau
Date: 2026-06-29T11:10:52Z
New Revision: ea595ebdf2bd7098dc32b1b5bc74479317520601
URL: https://github.com/llvm/llvm-project/commit/ea595ebdf2bd7098dc32b1b5bc74479317520601
DIFF: https://github.com/llvm/llvm-project/commit/ea595ebdf2bd7098dc32b1b5bc74479317520601.diff
LOG: [VPlan] Run addMiddleCheck before early exit handling. NFC (#206244)
Early exits with stores need to touch up the vector trip count used in
the middle block terminator. Currently we eagerly create the branch in
handlEarlyExits, but that means we need to avoid addMiddleCheck
afterwards since we'll already have a branch.
We can move addMiddleCheck before handlEarlyExits to create the branch
up front and then modify it for early exits with stores. This avoids the
need to conditionally run addMiddleCheck based on the
UncountableExitStyle, which makes it easier to compute the style purely
in VPlan later.
Added:
Modified:
llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
llvm/test/Transforms/LoopVectorize/VPlan/vplan-print-before-after-all.ll
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
index 15b5d23489545..60fe8fda120b4 100644
--- a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
+++ b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
@@ -6572,6 +6572,8 @@ VPlanPtr LoopVectorizationPlanner::tryToBuildVPlan1() {
OptForSize, SCEVCheckThreshold, ORE, OrigLoop))
return nullptr;
+ RUN_VPLAN_PASS(VPlanTransforms::addMiddleCheck, *VPlan0);
+
// If we're vectorizing a loop with an uncountable exit, make sure that the
// recipes are safe to handle.
// TODO: Remove this once we can properly check the VPlan itself for both
@@ -6588,11 +6590,6 @@ VPlanPtr LoopVectorizationPlanner::tryToBuildVPlan1() {
return nullptr;
}
- // If we're handling uncountable exits in the scalar tail after a vector
- // loop with an in-loop mask, then the middle check has already been
- // created to compare against the actual number of lanes executed.
- if (EEStyle != UncountableExitStyle::MaskedHandleExitInScalarLoop)
- RUN_VPLAN_PASS(VPlanTransforms::addMiddleCheck, *VPlan0);
RUN_VPLAN_PASS(VPlanTransforms::createLoopRegions, *VPlan0,
getDebugLocFromInstOrOperands(Legal->getPrimaryInduction()));
if (CM.foldTailByMasking())
diff --git a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
index 1a10da2f1d3bf..46c63bb47b165 100644
--- a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
+++ b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
@@ -4568,13 +4568,15 @@ static bool handleUncountableExitsWithSideEffects(
// against the full trip count, since we may be exiting the vector loop early.
// If we didn't take an early exit, we should get the equivalent of VF from
// the FirstActiveLane.
- VPBuilder MiddleBuilder(MiddleVPBB, MiddleVPBB->end());
+ assert(match(MiddleVPBB->getTerminator(), m_BranchOnCond()) &&
+ "Expected BranchOnCond terminator for MiddleVPBB");
+ VPBuilder MiddleBuilder(MiddleVPBB->getTerminator());
VPValue *ScalarIV = MiddleBuilder.createNaryOp(VPInstruction::ExtractLane,
{Zero, IV}, DebugLoc());
VPValue *ExitIV = MiddleBuilder.createAdd(ScalarIV, FirstActive);
VPValue *FullTC =
MiddleBuilder.createICmp(CmpInst::ICMP_EQ, ExitIV, Plan.getTripCount());
- MiddleBuilder.createNaryOp(VPInstruction::BranchOnCond, {FullTC});
+ MiddleVPBB->getTerminator()->setOperand(0, FullTC);
// Update resume phi in scalar.ph.
VPBasicBlock *ScalarPH = Plan.getScalarPreheader();
diff --git a/llvm/test/Transforms/LoopVectorize/VPlan/vplan-print-before-after-all.ll b/llvm/test/Transforms/LoopVectorize/VPlan/vplan-print-before-after-all.ll
index 86f709375286e..14590ff15c1d0 100644
--- a/llvm/test/Transforms/LoopVectorize/VPlan/vplan-print-before-after-all.ll
+++ b/llvm/test/Transforms/LoopVectorize/VPlan/vplan-print-before-after-all.ll
@@ -12,8 +12,8 @@
; CHECK: VPlan for loop in 'foo' [[BEFORE_OR_AFTER]] VPlanTransforms::createHeaderPhiRecipes
; CHECK: VPlan for loop in 'foo' [[BEFORE_OR_AFTER]] VPlanTransforms::replaceSymbolicStrides
; CHECK: VPlan for loop in 'foo' [[BEFORE_OR_AFTER]] VPlanTransforms::finalizeSCEVPredicates
-; CHECK: VPlan for loop in 'foo' [[BEFORE_OR_AFTER]] VPlanTransforms::handleEarlyExits
; CHECK: VPlan for loop in 'foo' [[BEFORE_OR_AFTER]] VPlanTransforms::addMiddleCheck
+; CHECK: VPlan for loop in 'foo' [[BEFORE_OR_AFTER]] VPlanTransforms::handleEarlyExits
; CHECK: VPlan for loop in 'foo' [[BEFORE_OR_AFTER]] VPlanTransforms::createLoopRegions
; CHECK: VPlan for loop in 'foo' [[BEFORE_OR_AFTER]] VPlanTransforms::introduceMasksAndLinearize
; CHECK: VPlan for loop in 'foo' [[BEFORE_OR_AFTER]] VPlanTransforms::createInLoopReductionRecipes
More information about the llvm-commits
mailing list