diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorizationPlanner.h b/llvm/lib/Transforms/Vectorize/LoopVectorizationPlanner.h --- a/llvm/lib/Transforms/Vectorize/LoopVectorizationPlanner.h +++ b/llvm/lib/Transforms/Vectorize/LoopVectorizationPlanner.h @@ -380,6 +380,9 @@ std::optional tryToBuildVPlanWithVPRecipes( VFRange &Range, SmallPtrSetImpl &DeadInstructions); + VPlanPtr buildInitialVPlanWithVPRecipes( + VFRange &Range, SmallPtrSetImpl &DeadInstructions); + /// Build VPlans for power-of-2 VF's between \p MinVF and \p MaxVF inclusive, /// according to the information gathered by Legal when it checked if it is /// legal to vectorize the loop. This method creates VPlans using VPRecipes. diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp --- a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp +++ b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp @@ -8888,7 +8888,7 @@ } } -std::optional LoopVectorizationPlanner::tryToBuildVPlanWithVPRecipes( +VPlanPtr LoopVectorizationPlanner::buildInitialVPlanWithVPRecipes( VFRange &Range, SmallPtrSetImpl &DeadInstructions) { SmallPtrSet *, 1> InterleaveGroups; @@ -9112,7 +9112,16 @@ for (ElementCount VF : Range) Plan->addVF(VF); Plan->setName("Initial VPlan"); + return Plan; +} + +std::optional LoopVectorizationPlanner::tryToBuildVPlanWithVPRecipes( + VFRange &Range, SmallPtrSetImpl &DeadInstructions) { + VPlanPtr Plan = buildInitialVPlanWithVPRecipes(Range, DeadInstructions); + + // Now optimize the initial VPlan. + // // Replace VPValues for known constant strides guaranteed by predicate scalar // evolution. for (auto [_, Stride] : Legal->getLAI()->getSymbolicStrides()) {