[llvm] 16910a2 - [VPlan] Move logic to create interleave groups to VPlanTransforms (NFC).
Florian Hahn via llvm-commits
llvm-commits at lists.llvm.org
Wed Aug 28 07:56:19 PDT 2024
Author: Florian Hahn
Date: 2024-08-28T15:56:09+01:00
New Revision: 16910a21ee0fabab2df291e4e5bc18289bd5762d
URL: https://github.com/llvm/llvm-project/commit/16910a21ee0fabab2df291e4e5bc18289bd5762d
DIFF: https://github.com/llvm/llvm-project/commit/16910a21ee0fabab2df291e4e5bc18289bd5762d.diff
LOG: [VPlan] Move logic to create interleave groups to VPlanTransforms (NFC).
This is a step towards further breaking up the rather large
tryToBuildVPlanWithVPRecipes. It moves logic create interleave groups to
VPlanTransforms.cpp, where similar replacements for other recipes are
defined as well (e.g. EVL-based ones)
Added:
Modified:
llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
llvm/lib/Transforms/Vectorize/VPlanTransforms.h
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
index beef373e525c8f..4c68a95b9c2678 100644
--- a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
+++ b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
@@ -8988,35 +8988,8 @@ LoopVectorizationPlanner::tryToBuildVPlanWithVPRecipes(VFRange &Range) {
// Interleave memory: for each Interleave Group we marked earlier as relevant
// for this VPlan, replace the Recipes widening its memory instructions with a
// single VPInterleaveRecipe at its insertion point.
- for (const auto *IG : InterleaveGroups) {
- auto *Recipe =
- cast<VPWidenMemoryRecipe>(RecipeBuilder.getRecipe(IG->getInsertPos()));
- SmallVector<VPValue *, 4> StoredValues;
- for (unsigned i = 0; i < IG->getFactor(); ++i)
- if (auto *SI = dyn_cast_or_null<StoreInst>(IG->getMember(i))) {
- auto *StoreR = cast<VPWidenStoreRecipe>(RecipeBuilder.getRecipe(SI));
- StoredValues.push_back(StoreR->getStoredValue());
- }
-
- bool NeedsMaskForGaps =
- IG->requiresScalarEpilogue() && !CM.isScalarEpilogueAllowed();
- assert((!NeedsMaskForGaps || useMaskedInterleavedAccesses(CM.TTI)) &&
- "masked interleaved groups are not allowed.");
- auto *VPIG = new VPInterleaveRecipe(IG, Recipe->getAddr(), StoredValues,
- Recipe->getMask(), NeedsMaskForGaps);
- VPIG->insertBefore(Recipe);
- unsigned J = 0;
- for (unsigned i = 0; i < IG->getFactor(); ++i)
- if (Instruction *Member = IG->getMember(i)) {
- VPRecipeBase *MemberR = RecipeBuilder.getRecipe(Member);
- if (!Member->getType()->isVoidTy()) {
- VPValue *OriginalV = MemberR->getVPSingleValue();
- OriginalV->replaceAllUsesWith(VPIG->getVPValue(J));
- J++;
- }
- MemberR->eraseFromParent();
- }
- }
+ VPlanTransforms::createInterleaveGroups(InterleaveGroups, RecipeBuilder,
+ CM.isScalarEpilogueAllowed());
for (ElementCount VF : Range)
Plan->addVF(VF);
diff --git a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
index c56fdee153f5f3..ee7c7cea0b7670 100644
--- a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
+++ b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
@@ -1520,3 +1520,38 @@ void VPlanTransforms::dropPoisonGeneratingRecipes(
}
}
}
+
+void VPlanTransforms::createInterleaveGroups(
+ const SmallPtrSetImpl<const InterleaveGroup<Instruction> *> &InterleaveGroups,
+ VPRecipeBuilder &RecipeBuilder, bool ScalarEpilogueAllowed) {
+ // Interleave memory: for each Interleave Group we marked earlier as relevant
+ // for this VPlan, replace the Recipes widening its memory instructions with a
+ // single VPInterleaveRecipe at its insertion point.
+ for (const auto *IG : InterleaveGroups) {
+ auto *Recipe =
+ cast<VPWidenMemoryRecipe>(RecipeBuilder.getRecipe(IG->getInsertPos()));
+ SmallVector<VPValue *, 4> StoredValues;
+ for (unsigned i = 0; i < IG->getFactor(); ++i)
+ if (auto *SI = dyn_cast_or_null<StoreInst>(IG->getMember(i))) {
+ auto *StoreR = cast<VPWidenStoreRecipe>(RecipeBuilder.getRecipe(SI));
+ StoredValues.push_back(StoreR->getStoredValue());
+ }
+
+ bool NeedsMaskForGaps =
+ IG->requiresScalarEpilogue() && !ScalarEpilogueAllowed;
+ auto *VPIG = new VPInterleaveRecipe(IG, Recipe->getAddr(), StoredValues,
+ Recipe->getMask(), NeedsMaskForGaps);
+ VPIG->insertBefore(Recipe);
+ unsigned J = 0;
+ for (unsigned i = 0; i < IG->getFactor(); ++i)
+ if (Instruction *Member = IG->getMember(i)) {
+ VPRecipeBase *MemberR = RecipeBuilder.getRecipe(Member);
+ if (!Member->getType()->isVoidTy()) {
+ VPValue *OriginalV = MemberR->getVPSingleValue();
+ OriginalV->replaceAllUsesWith(VPIG->getVPValue(J));
+ J++;
+ }
+ MemberR->eraseFromParent();
+ }
+ }
+}
diff --git a/llvm/lib/Transforms/Vectorize/VPlanTransforms.h b/llvm/lib/Transforms/Vectorize/VPlanTransforms.h
index 96b8a6639723c2..e714f69eeff1ab 100644
--- a/llvm/lib/Transforms/Vectorize/VPlanTransforms.h
+++ b/llvm/lib/Transforms/Vectorize/VPlanTransforms.h
@@ -25,6 +25,7 @@ class ScalarEvolution;
class PredicatedScalarEvolution;
class TargetLibraryInfo;
class VPBuilder;
+class VPRecipeBuilder;
struct VPlanTransforms {
/// Replaces the VPInstructions in \p Plan with corresponding
@@ -106,6 +107,13 @@ struct VPlanTransforms {
/// this transformation.
/// \returns true if the transformation succeeds, or false if it doesn't.
static bool tryAddExplicitVectorLength(VPlan &Plan);
+
+ // For each Interleave Group in \p InterleaveGroups replace the Recipes
+ // widening its memory instructions with a single VPInterleaveRecipe at its
+ // insertion point.
+ static void createInterleaveGroups(
+ const SmallPtrSetImpl<const InterleaveGroup<Instruction> *> &InterleaveGroups,
+ VPRecipeBuilder &RecipeBuilder, bool ScalarEpilogueAllowed);
};
} // namespace llvm
More information about the llvm-commits
mailing list