[llvm] [VPlan] Add transform to replace VPWidenCanonicalIV with wide IV. (PR #194267)
Ramkumar Ramachandra via llvm-commits
llvm-commits at lists.llvm.org
Tue Apr 28 02:03:56 PDT 2026
================
@@ -691,6 +691,73 @@ static void removeRedundantCanonicalIVs(VPlan &Plan) {
}
}
+void VPlanTransforms::replaceWidenCanonicalIVWithWidenIV(
+ VPlan &Plan, ScalarEvolution &SE, const TargetTransformInfo &TTI,
+ TargetTransformInfo::TargetCostKind CostKind, ElementCount VF, unsigned UF,
+ const SmallPtrSetImpl<const Value *> &ValuesToIgnore) {
+ VPRegionBlock *LoopRegion = Plan.getVectorLoopRegion();
+ if (!LoopRegion || Plan.hasScalarVFOnly())
+ return;
+
+ VPValue *CanonicalIV = LoopRegion->getCanonicalIV();
+ auto *WideCanIV = vputils::findUserOf<VPWidenCanonicalIVRecipe>(CanonicalIV);
+ if (!WideCanIV)
+ return;
+
+ // If a canonical VPWidenIntOrFpInductionRecipe already exists, reuse it.
+ VPBasicBlock *Header = LoopRegion->getEntryBasicBlock();
+ for (VPRecipeBase &Phi : Header->phis()) {
+ auto *WideIV = dyn_cast<VPWidenIntOrFpInductionRecipe>(&Phi);
+ if (!WideIV || !WideIV->isCanonical())
+ continue;
+ // The canonical wide IV is used to compute the header mask, hence all
+ // lanes will be used. Drop poison-generating flags.
+ WideIV->dropPoisonGeneratingFlags();
+ WideCanIV->replaceAllUsesWith(WideIV);
+ WideCanIV->eraseFromParent();
+ return;
+ }
----------------
artagnon wrote:
I would say: let removeRedundantCanonicalIVs do this part as in https://github.com/llvm/llvm-project/pull/194338 -- can we review and get that part landed first, before looking at the cost-based replacement separately?
https://github.com/llvm/llvm-project/pull/194267
More information about the llvm-commits
mailing list