Skip to content

Commit 16910a2

Browse files
committed
[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)
1 parent a3cd8d7 commit 16910a2

File tree

3 files changed

+45
-29
lines changed

3 files changed

+45
-29
lines changed

llvm/lib/Transforms/Vectorize/LoopVectorize.cpp

Lines changed: 2 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -8988,35 +8988,8 @@ LoopVectorizationPlanner::tryToBuildVPlanWithVPRecipes(VFRange &Range) {
89888988
// Interleave memory: for each Interleave Group we marked earlier as relevant
89898989
// for this VPlan, replace the Recipes widening its memory instructions with a
89908990
// single VPInterleaveRecipe at its insertion point.
8991-
for (const auto *IG : InterleaveGroups) {
8992-
auto *Recipe =
8993-
cast<VPWidenMemoryRecipe>(RecipeBuilder.getRecipe(IG->getInsertPos()));
8994-
SmallVector<VPValue *, 4> StoredValues;
8995-
for (unsigned i = 0; i < IG->getFactor(); ++i)
8996-
if (auto *SI = dyn_cast_or_null<StoreInst>(IG->getMember(i))) {
8997-
auto *StoreR = cast<VPWidenStoreRecipe>(RecipeBuilder.getRecipe(SI));
8998-
StoredValues.push_back(StoreR->getStoredValue());
8999-
}
9000-
9001-
bool NeedsMaskForGaps =
9002-
IG->requiresScalarEpilogue() && !CM.isScalarEpilogueAllowed();
9003-
assert((!NeedsMaskForGaps || useMaskedInterleavedAccesses(CM.TTI)) &&
9004-
"masked interleaved groups are not allowed.");
9005-
auto *VPIG = new VPInterleaveRecipe(IG, Recipe->getAddr(), StoredValues,
9006-
Recipe->getMask(), NeedsMaskForGaps);
9007-
VPIG->insertBefore(Recipe);
9008-
unsigned J = 0;
9009-
for (unsigned i = 0; i < IG->getFactor(); ++i)
9010-
if (Instruction *Member = IG->getMember(i)) {
9011-
VPRecipeBase *MemberR = RecipeBuilder.getRecipe(Member);
9012-
if (!Member->getType()->isVoidTy()) {
9013-
VPValue *OriginalV = MemberR->getVPSingleValue();
9014-
OriginalV->replaceAllUsesWith(VPIG->getVPValue(J));
9015-
J++;
9016-
}
9017-
MemberR->eraseFromParent();
9018-
}
9019-
}
8991+
VPlanTransforms::createInterleaveGroups(InterleaveGroups, RecipeBuilder,
8992+
CM.isScalarEpilogueAllowed());
90208993

90218994
for (ElementCount VF : Range)
90228995
Plan->addVF(VF);

llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1520,3 +1520,38 @@ void VPlanTransforms::dropPoisonGeneratingRecipes(
15201520
}
15211521
}
15221522
}
1523+
1524+
void VPlanTransforms::createInterleaveGroups(
1525+
const SmallPtrSetImpl<const InterleaveGroup<Instruction> *> &InterleaveGroups,
1526+
VPRecipeBuilder &RecipeBuilder, bool ScalarEpilogueAllowed) {
1527+
// Interleave memory: for each Interleave Group we marked earlier as relevant
1528+
// for this VPlan, replace the Recipes widening its memory instructions with a
1529+
// single VPInterleaveRecipe at its insertion point.
1530+
for (const auto *IG : InterleaveGroups) {
1531+
auto *Recipe =
1532+
cast<VPWidenMemoryRecipe>(RecipeBuilder.getRecipe(IG->getInsertPos()));
1533+
SmallVector<VPValue *, 4> StoredValues;
1534+
for (unsigned i = 0; i < IG->getFactor(); ++i)
1535+
if (auto *SI = dyn_cast_or_null<StoreInst>(IG->getMember(i))) {
1536+
auto *StoreR = cast<VPWidenStoreRecipe>(RecipeBuilder.getRecipe(SI));
1537+
StoredValues.push_back(StoreR->getStoredValue());
1538+
}
1539+
1540+
bool NeedsMaskForGaps =
1541+
IG->requiresScalarEpilogue() && !ScalarEpilogueAllowed;
1542+
auto *VPIG = new VPInterleaveRecipe(IG, Recipe->getAddr(), StoredValues,
1543+
Recipe->getMask(), NeedsMaskForGaps);
1544+
VPIG->insertBefore(Recipe);
1545+
unsigned J = 0;
1546+
for (unsigned i = 0; i < IG->getFactor(); ++i)
1547+
if (Instruction *Member = IG->getMember(i)) {
1548+
VPRecipeBase *MemberR = RecipeBuilder.getRecipe(Member);
1549+
if (!Member->getType()->isVoidTy()) {
1550+
VPValue *OriginalV = MemberR->getVPSingleValue();
1551+
OriginalV->replaceAllUsesWith(VPIG->getVPValue(J));
1552+
J++;
1553+
}
1554+
MemberR->eraseFromParent();
1555+
}
1556+
}
1557+
}

llvm/lib/Transforms/Vectorize/VPlanTransforms.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ class ScalarEvolution;
2525
class PredicatedScalarEvolution;
2626
class TargetLibraryInfo;
2727
class VPBuilder;
28+
class VPRecipeBuilder;
2829

2930
struct VPlanTransforms {
3031
/// Replaces the VPInstructions in \p Plan with corresponding
@@ -106,6 +107,13 @@ struct VPlanTransforms {
106107
/// this transformation.
107108
/// \returns true if the transformation succeeds, or false if it doesn't.
108109
static bool tryAddExplicitVectorLength(VPlan &Plan);
110+
111+
// For each Interleave Group in \p InterleaveGroups replace the Recipes
112+
// widening its memory instructions with a single VPInterleaveRecipe at its
113+
// insertion point.
114+
static void createInterleaveGroups(
115+
const SmallPtrSetImpl<const InterleaveGroup<Instruction> *> &InterleaveGroups,
116+
VPRecipeBuilder &RecipeBuilder, bool ScalarEpilogueAllowed);
109117
};
110118

111119
} // namespace llvm

0 commit comments

Comments
 (0)