From 70c4fc11ab6e36f532f8065649a68c67aa165a79 Mon Sep 17 00:00:00 2001 From: Luke Lau Date: Thu, 29 May 2025 18:55:20 +0100 Subject: [PATCH] [VPlan] Convert to concrete recipes before dissolving loop regions. NFCI After updating #118638 on tip of tree, expanding VPWidenIntOrFpInductionRecipes fails because it needs the loop region to get the latch to insert the increment into: VPBasicBlock *ExitingBB = Plan->getVectorLoopRegion()->getExitingBasicBlock(); Builder.setInsertPoint(ExitingBB, ExitingBB->getTerminator()->getIterator()); auto *Next = Builder.createNaryOp(AddOp, {Prev, Inc}, Flags, WidenIVR->getDebugLoc(), "vec.ind.next"); However after #117506, the region is dissolved so it doesn't work. This shuffles the dissolveLoopRegions steps to be after convertToConcreteRecipes so we can use the region when expanding VPWidenIntOrFpInductionRecipes --- llvm/lib/Transforms/Vectorize/LoopVectorize.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp index 90e224ea8f37a..6bd06410614de 100644 --- a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp +++ b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp @@ -7568,14 +7568,14 @@ DenseMap LoopVectorizationPlanner::executePlan( TTI.getRegisterBitWidth(TargetTransformInfo::RGK_FixedWidthVector)); VPlanTransforms::removeDeadRecipes(BestVPlan); + VPlanTransforms::convertToConcreteRecipes(BestVPlan, + *Legal->getWidestInductionType()); // Retrieve and store the middle block before dissolving regions. Regions are // dissolved after optimizing for VF and UF, which completely removes unneeded // loop regions first. VPBasicBlock *MiddleVPBB = BestVPlan.getVectorLoopRegion() ? BestVPlan.getMiddleBlock() : nullptr; VPlanTransforms::dissolveLoopRegions(BestVPlan); - VPlanTransforms::convertToConcreteRecipes(BestVPlan, - *Legal->getWidestInductionType()); // Perform the actual loop transformation. VPTransformState State(&TTI, BestVF, LI, DT, ILV.AC, ILV.Builder, &BestVPlan, OrigLoop->getParentLoop(),