[llvm] [VPlan] Introduce ComputeReductionResult VPInstruction opcode. (PR #70253)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Dec 18 08:36:53 PST 2023
================
@@ -7640,6 +7463,42 @@ SCEV2ValueTy LoopVectorizationPlanner::executePlan(
BestVPlan.execute(&State);
+ DenseMap<const RecurrenceDescriptor *, Value *> ReductionResumeValues;
+ BasicBlock *OrigScalarPH = OrigLoop->getLoopPreheader();
+ // Check if ResResult is a CompueReductionResult instruction, and if it is
+ // return the merge phi node for it.
+ auto GetMergePhiForReduction = [&State,
+ OrigScalarPH](VPInstruction *RedResult)
+ -> std::pair<const RecurrenceDescriptor *, PHINode *> {
+ if (!RedResult ||
+ RedResult->getOpcode() != VPInstruction::ComputeReductionResult)
+ return {nullptr, nullptr};
+
+ Value *FinalValue =
+ State.get(RedResult, VPIteration(State.UF - 1,
+ VPLane::getLastLaneForVF(State.VF)));
+ auto *PhiR = cast<VPReductionPHIRecipe>(RedResult->getOperand(0));
+ assert(FinalValue->hasOneUse() || PhiR->isInLoop() ||
+ PhiR->getRecurrenceDescriptor().IntermediateStore &&
+ "unexpected final value");
+
+ // Find the merge phi, which must be located in the preheader of the
+ // original scalar loop.
+ auto It = find_if(FinalValue->users(), [OrigScalarPH](Value *U) {
+ auto *P = dyn_cast<PHINode>(U);
+ return P && OrigScalarPH == P->getParent();
+ });
+ assert(It != FinalValue->users().end() && "must have merge phi");
+ return {&PhiR->getRecurrenceDescriptor(), cast<PHINode>(*It)};
+ };
+ for (VPRecipeBase &R : *cast<VPBasicBlock>(
+ BestVPlan.getVectorLoopRegion()->getSingleSuccessor())) {
+ const auto &[RedRdx, MergePhi] =
+ GetMergePhiForReduction(dyn_cast<VPInstruction>(&R));
----------------
ayalz wrote:
Better pass the map to RecordMergePhiForReduction() than return two values just to record them in it?
https://github.com/llvm/llvm-project/pull/70253
More information about the llvm-commits
mailing list