[llvm] [VPlan] Impl VPlan-based pattern match for ExtendedRed and MulAccRed (NFCI) (PR #113903)
Alexey Bataev via llvm-commits
llvm-commits at lists.llvm.org
Tue Dec 24 10:58:02 PST 2024
================
@@ -1851,6 +1859,88 @@ void VPlanTransforms::createInterleaveGroups(
}
}
+// Expand VPExtendedReductionRecipe to VPWidenCastRecipe + VPReductionRecipe.
+static void expandVPExtendedReduction(VPExtendedReductionRecipe *ExtRed) {
+ // Genearte VPWidenCastRecipe.
+ VPWidenCastRecipe *Ext;
+ // Only ZExt contiains non-neg flags.
+ if (ExtRed->isZExt())
+ Ext = new VPWidenCastRecipe(ExtRed->getExtOpcode(), ExtRed->getVecOp(),
+ ExtRed->getResultType(), ExtRed->isNonNeg(),
+ ExtRed->getExtDebugLoc());
+ else
+ Ext = new VPWidenCastRecipe(ExtRed->getExtOpcode(), ExtRed->getVecOp(),
+ ExtRed->getResultType(),
+ ExtRed->getExtDebugLoc());
+
+ // Generate VPreductionRecipe.
+ auto *Red = new VPReductionRecipe(
+ ExtRed->getRecurrenceDescriptor(), ExtRed->getChainOp(), Ext,
+ ExtRed->getCondOp(), ExtRed->isOrdered(), ExtRed->getRedDebugLoc());
+ Ext->insertBefore(ExtRed);
+ Red->insertBefore(ExtRed);
+ ExtRed->replaceAllUsesWith(Red);
+ ExtRed->eraseFromParent();
+}
+
+// Expand VPMulAccumulateReductionRecipe to VPWidenRecipe (mul) +
+// VPReductionRecipe (reduce.add)
+// + VPWidenCastRecipe (optional).
+static void
+expandVPMulAccumulateReduction(VPMulAccumulateReductionRecipe *MulAcc) {
+ Type *RedTy = MulAcc->getRecurrenceDescriptor().getRecurrenceType();
+
+ // Generate inner VPWidenCastRecipes if necessary.
+ // Note that we will drop the extend after mul which transform
+ // reduce.add(ext(mul(ext, ext))) to reduce.add(mul(ext, ext)).
+ VPValue *Op0, *Op1;
+ if (MulAcc->isExtended()) {
+ if (MulAcc->isZExt())
+ Op0 = new VPWidenCastRecipe(MulAcc->getExtOpcode(), MulAcc->getVecOp0(),
+ RedTy, MulAcc->isNonNeg(),
+ MulAcc->getExt0DebugLoc());
+ else
+ Op0 = new VPWidenCastRecipe(MulAcc->getExtOpcode(), MulAcc->getVecOp0(),
+ RedTy, MulAcc->getExt0DebugLoc());
+ Op0->getDefiningRecipe()->insertBefore(MulAcc);
+ // Prevent reduce.add(mul(ext(A), ext(A))) generate duplicate
+ // VPWidenCastRecipe.
+ if (MulAcc->getVecOp0() == MulAcc->getVecOp1()) {
+ Op1 = Op0;
+ } else {
+ if (MulAcc->isZExt())
----------------
alexey-bataev wrote:
```suggestion
} else if (MulAcc->isZExt())
```
https://github.com/llvm/llvm-project/pull/113903
More information about the llvm-commits
mailing list