[llvm] [VPlan] Split off VPReductionRecipe creation for in-loop reductions (NFC) (PR #168784)
Florian Hahn via llvm-commits
llvm-commits at lists.llvm.org
Wed Dec 24 15:23:20 PST 2025
================
@@ -702,6 +703,168 @@ void VPlanTransforms::createHeaderPhiRecipes(
}
}
+void VPlanTransforms::createInLoopReductionRecipes(
+ VPlan &Plan, const DenseMap<VPBasicBlock *, VPValue *> &BlockMaskCache,
+ const DenseSet<BasicBlock *> &BlocksNeedingPredication,
+ ElementCount MinVF) {
+ VPTypeAnalysis TypeInfo(Plan);
+ VPBasicBlock *Header = Plan.getVectorLoopRegion()->getEntryBasicBlock();
+ SmallVector<VPRecipeBase *> ToDelete;
+
+ for (VPRecipeBase &R : Header->phis()) {
+ auto *PhiR = dyn_cast<VPReductionPHIRecipe>(&R);
+ if (!PhiR || !PhiR->isInLoop() || (MinVF.isScalar() && !PhiR->isOrdered()))
+ continue;
+
+ RecurKind Kind = PhiR->getRecurrenceKind();
+ assert(
+ !RecurrenceDescriptor::isAnyOfRecurrenceKind(Kind) &&
+ !RecurrenceDescriptor::isFindIVRecurrenceKind(Kind) &&
+ "AnyOf and FindIV reductions are not allowed for in-loop reductions");
+
+ bool IsFPRecurrence =
+ RecurrenceDescriptor::isFloatingPointRecurrenceKind(Kind);
+ FastMathFlags FMFs =
+ IsFPRecurrence ? FastMathFlags::getFast() : FastMathFlags();
+
+ // Collect the chain of "link" recipes for the reduction starting at PhiR.
+ SetVector<VPSingleDefRecipe *> Worklist;
+ Worklist.insert(PhiR);
+ for (unsigned I = 0; I != Worklist.size(); ++I) {
+ VPSingleDefRecipe *Cur = Worklist[I];
+ for (VPUser *U : Cur->users()) {
+ auto *UserRecipe = cast<VPSingleDefRecipe>(U);
+ if (!UserRecipe->getParent()->getEnclosingLoopRegion()) {
+ assert((UserRecipe->getParent() == Plan.getMiddleBlock() ||
+ UserRecipe->getParent() == Plan.getScalarPreheader()) &&
+ "U must be either in the loop region, the middle block or the "
+ "scalar preheader.");
+ continue;
+ }
+
+ // Stores using instructions will be sunk later.
+ if (match(UserRecipe, m_VPInstruction<Instruction::Store>()))
+ continue;
----------------
fhahn wrote:
Yep, this is needed now, as previously the sinking would happen before the transform runs.
https://github.com/llvm/llvm-project/pull/168784
More information about the llvm-commits
mailing list