[llvm] [LV] Use ResumeForEpilogue for header phi resume in epilogue plan (NFC) (PR #203786)
Florian Hahn via llvm-commits
llvm-commits at lists.llvm.org
Sun Jun 14 13:07:14 PDT 2026
https://github.com/fhahn created https://github.com/llvm/llvm-project/pull/203786
Pass the ResumeForEpilogue VPInstructions created by preparePlanForMainVectorLoop into preparePlanForEpilogueVectorLoop and get the resume IR from ResumeForEpilogue::getUnderlyingValue()
>From c1affa5371c687958a6a2aea2a6930270507eb2e Mon Sep 17 00:00:00 2001
From: Florian Hahn <flo at fhahn.com>
Date: Sat, 9 May 2026 15:52:35 +0100
Subject: [PATCH] [LV] Use ResumeForEpilogue for header phi resume in epilogue
plan (NFC)
Pass the ResumeForEpilogue VPInstructions created by
preparePlanForMainVectorLoop into preparePlanForEpilogueVectorLoop and
get the resume IR from ResumeForEpilogue::getUnderlyingValue()
---
.../Transforms/Vectorize/LoopVectorize.cpp | 24 ++++++++++++-------
1 file changed, 15 insertions(+), 9 deletions(-)
diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
index e815dbcd96e54..70ef858292a69 100644
--- a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
+++ b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
@@ -7500,7 +7500,15 @@ preparePlanForMainVectorLoop(VPlan &MainPlan, VPlan &EpiPlan) {
static SmallVector<Instruction *> preparePlanForEpilogueVectorLoop(
VPlan &MainPlan, VPlan &Plan, Loop *L, const SCEV2ValueTy &ExpandedSCEVs,
EpilogueLoopVectorizationInfo &EPI, LoopVectorizationCostModel &CM,
- VFSelectionContext &Config, ScalarEvolution &SE) {
+ VFSelectionContext &Config, ScalarEvolution &SE,
+ ArrayRef<VPInstruction *> ResumeValues) {
+ // Build a map from the scalar-header PHI to the ResumeForEpilogue markers
+ // from the main plan.
+ // TODO: Replace the IR PHI key.
+ DenseMap<PHINode *, VPInstruction *> IRPhiToResumeForEpi;
+ for (auto [HeaderPhi, ResumeForEpi] :
+ zip_equal(MainPlan.getScalarHeader()->phis(), ResumeValues))
+ IRPhiToResumeForEpi[&cast<VPIRPhi>(HeaderPhi).getIRPhi()] = ResumeForEpi;
VPRegionBlock *VectorLoop = Plan.getVectorLoopRegion();
VPBasicBlock *Header = VectorLoop->getEntryBasicBlock();
Header->setName("vec.epilog.vector.body");
@@ -7575,8 +7583,9 @@ static SmallVector<Instruction *> preparePlanForEpilogueVectorLoop(
vputils::findRecipe(ReductionPhi->getBackedgeValue(), IsReductionResult));
assert(RdxResult && "expected to find reduction result");
- ResumeV = cast<PHINode>(ReductionPhi->getUnderlyingInstr())
- ->getIncomingValueForBlock(L->getLoopPreheader());
+ ResumeV = IRPhiToResumeForEpi
+ .at(cast<PHINode>(ReductionPhi->getUnderlyingInstr()))
+ ->getUnderlyingValue();
// Check for FindIV pattern by looking for icmp user of RdxResult.
// The pattern is: select(icmp ne RdxResult, Sentinel), RdxResult, Start
@@ -7656,12 +7665,9 @@ static SmallVector<Instruction *> preparePlanForEpilogueVectorLoop(
}
}
} else {
- // Retrieve the induction resume values for wide inductions from
- // their original phi nodes in the scalar loop.
+ // Retrieve the induction resume value via ResumeForEpilogue.
PHINode *IndPhi = cast<VPWidenInductionRecipe>(&R)->getPHINode();
- // Hook up to the PHINode generated by a ResumePhi recipe of main
- // loop VPlan, which feeds the scalar loop.
- ResumeV = IndPhi->getIncomingValueForBlock(L->getLoopPreheader());
+ ResumeV = IRPhiToResumeForEpi.at(IndPhi)->getUnderlyingValue();
}
assert(ResumeV && "Must have a resume value");
VPValue *StartVal = Plan.getOrAddLiveIn(ResumeV);
@@ -8309,7 +8315,7 @@ bool LoopVectorizePass::processLoop(Loop *L) {
Checks, BestEpiPlan);
SmallVector<Instruction *> InstsToMove = preparePlanForEpilogueVectorLoop(
BestMainPlan, BestEpiPlan, L, ExpandedSCEVs, EPI, CM, Config,
- *PSE.getSE());
+ *PSE.getSE(), ResumeValues);
LVP.attachRuntimeChecks(BestEpiPlan, Checks, HasBranchWeights);
LVP.executePlan(
EPI.EpilogueVF, EPI.EpilogueUF, BestEpiPlan, EpilogILV, DT,
More information about the llvm-commits
mailing list