[llvm] [VPlan] Add VPSingleDefBundleRecipe, replacing extended reduction recipes. (PR #144281)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Jun 30 06:34:18 PDT 2025
================
@@ -2930,6 +2719,122 @@ class VPBranchOnMaskRecipe : public VPRecipeBase {
}
};
+/// A recipe to combine multiple recipes into a 'bundle' recipe, which should be
+/// considered a single entity for cost-modeling and transforms. The recipe
+/// needs to be 'unbundled', i.e. replaced by its bundled recipes before
+/// execute. The bundled recipes are completely disconnected from the def-use
+/// graph of other, non-bundled recipes. Def-use edges between pairs of bundled
+/// recipes remain intact, whereas every edge between a bundled and a
+/// non-bundled recipe is elevated to connect the non-bundled recipe with the
+/// VPSingleDefBundleRecipe itself.
+class VPSingleDefBundleRecipe : public VPSingleDefRecipe {
+ /// Recipes bundled together in this VPSingleDefBundleRecipe.
+ SmallVector<VPSingleDefRecipe *> BundledRecipes;
+
+ /// Temporary VPValues used for external operands of the bundle, i.e. operands
+ /// not defined by recipes in the bundle.
+ SmallVector<VPValue *> BundleLiveInPlaceholders;
+
+ enum class BundleTypes {
+ /// Represents an inloop extended reduction operation, performing a
+ /// reduction on a extended vector operand into a scalar value, and adding
+ /// the result to a chain.
+ ExtendedReduction,
+ /// Represent an inloop multiply-accumulate reduction, multiplying the
+ /// extended vector operands, performing a reduction.add on the result, and
+ /// adding the scalar result to a chain.
+ ExtMulAccumulateReduction,
+ /// Represent an inloop multiply-accumulate reduction, multiplying the
+ /// vector operands, performing a reduction.add on the result, and adding
+ /// the scalar result to a chain.
+ MulAccumulateReduction,
+ };
+
+ /// Type of the bundle.
+ BundleTypes BundleType;
+
+ /// Construct a new VPSingleDefBundleRecipe by internalizing recipes in \p
+ /// BundledRecipes. External operands (i.e. not defined by another recipe in
+ /// the bundle) are replaced by temporary VPValues and the original operands
+ /// are transferred to the VPSingleDefBundleRecipe itself. Clone recipes as
+ /// needed (excluding last) to ensure they are only used by other recipes in
+ /// the bundle.
+ VPSingleDefBundleRecipe(BundleTypes BundleType,
+ ArrayRef<VPSingleDefRecipe *> ToBundle);
+
+public:
+ VPSingleDefBundleRecipe(VPWidenCastRecipe *Ext, VPReductionRecipe *Red)
+ : VPSingleDefBundleRecipe(BundleTypes::ExtendedReduction, {Ext, Red}) {}
+ VPSingleDefBundleRecipe(VPWidenRecipe *Mul, VPReductionRecipe *Red)
+ : VPSingleDefBundleRecipe(BundleTypes::MulAccumulateReduction,
+ {Mul, Red}) {}
+ VPSingleDefBundleRecipe(VPWidenCastRecipe *Ext0, VPWidenCastRecipe *Ext1,
+ VPWidenRecipe *Mul, VPReductionRecipe *Red)
+ : VPSingleDefBundleRecipe(BundleTypes::ExtMulAccumulateReduction,
+ {Ext0, Ext1, Mul, Red}) {}
+
+ ~VPSingleDefBundleRecipe() override {
+ SmallPtrSet<VPRecipeBase *, 4> Seen;
+ for (auto *R : reverse(BundledRecipes))
+ if (Seen.insert(R).second)
+ delete R;
----------------
ayalz wrote:
Should the recipe unbundle() itself now, upon destruction, leaving its bundled recipes to be destructed by their basic block, or simply assert that this has already taken place?
```suggestion
assert(BundledRecipes.empty() && "must unbundle before destruction");
```
https://github.com/llvm/llvm-project/pull/144281
More information about the llvm-commits
mailing list