[llvm] [LoopVectorizer] Add support for partial reductions (PR #92418)

Graham Hunter via llvm-commits llvm-commits at lists.llvm.org
Fri Sep 13 03:25:48 PDT 2024


================
@@ -308,6 +308,53 @@ InstructionCost VPRecipeBase::computeCost(ElementCount VF,
   return UI ? Ctx.getLegacyCost(UI, VF) : 0;
 }
 
+void VPPartialReductionRecipe::execute(VPTransformState &State) {
+  State.setDebugLocFrom(getDebugLoc());
+  auto &Builder = State.Builder;
+
+  assert(Opcode == Instruction::Add && "Unhandled partial reduction opcode");
+
+  for (unsigned Part = 0; Part < State.UF; ++Part) {
+    Value *Mul = nullptr;
+    Value *Phi = nullptr;
+    SmallVector<Value *, 2> Ops;
+    for (VPValue *VPOp : operands()) {
+      auto *Op = State.get(VPOp, Part);
+      Ops.push_back(Op);
+      if (isa<PHINode>(Op))
+        Phi = Op;
+      else
+        Mul = Op;
+    }
+
+    assert(Phi && Mul && "Phi and Mul must be set");
+
+    VectorType *FullTy = cast<VectorType>(Ops[0]->getType());
----------------
huntergr-arm wrote:

The `Ops` SmallVector seems to only exist for this?

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


More information about the llvm-commits mailing list