[llvm] [VPlan] Introduce ComputeReductionResult VPInstruction opcode. (PR #70253)

Florian Hahn via llvm-commits llvm-commits at lists.llvm.org
Wed Dec 20 12:03:15 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));
----------------
fhahn wrote:

Done, thanks!

https://github.com/llvm/llvm-project/pull/70253


More information about the llvm-commits mailing list