[llvm] [VPlan] Add transformation to narrow interleave groups. (PR #106441)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Jan 8 17:01:28 PST 2025
================
@@ -1994,3 +1997,124 @@ void VPlanTransforms::handleUncountableEarlyExit(
Builder.createNaryOp(VPInstruction::BranchOnCond, AnyExitTaken);
LatchExitingBranch->eraseFromParent();
}
+
+static bool supportedLoad(VPWidenRecipe *R0, VPValue *V, unsigned Idx) {
+ if (auto *W = dyn_cast_or_null<VPWidenLoadRecipe>(V->getDefiningRecipe()))
+ return !W->getMask() && (R0->getOperand(0) == V || R0->getOperand(1) == V);
+
+ if (auto *IR = dyn_cast_or_null<VPInterleaveRecipe>(V->getDefiningRecipe()))
+ return IR->getInterleaveGroup()->getFactor() ==
+ IR->getInterleaveGroup()->getNumMembers() &&
+ IR->getVPValue(Idx) == V;
+ return false;
+}
+
+/// Returns true if \p IR is a full interleave group with factor and number of
+/// members both equal to \p VF.
+static bool isConsecutiveInterleaveGroup(VPInterleaveRecipe *IR,
+ ElementCount VF) {
+ if (!IR)
+ return false;
+ auto IG = IR->getInterleaveGroup();
+ return IG->getFactor() == IG->getNumMembers() &&
+ IG->getNumMembers() == VF.getFixedValue();
+}
+
+void VPlanTransforms::narrowInterleaveGroups(VPlan &Plan, ElementCount VF) {
+ using namespace llvm::VPlanPatternMatch;
+ VPRegionBlock *VectorLoop = Plan.getVectorLoopRegion();
+ if (VF.isScalable() || !VectorLoop)
+ return;
+
+ SmallVector<VPInterleaveRecipe *> StoreGroups;
+ for (auto &R : *VectorLoop->getEntryBasicBlock()) {
+ if (isa<VPCanonicalIVPHIRecipe>(&R) ||
+ match(&R, m_BranchOnCount(m_VPValue(), m_VPValue())))
+ continue;
+
+ // Bail out on recipes not supported at the moment:
+ // * phi recipes other than the canonical induction
+ // * recipes writing to memory except interleave groups
+ // Only support plans with a canonical induction phi.
+ if (R.isPhi())
+ return;
+
+ auto *IR = dyn_cast<VPInterleaveRecipe>(&R);
+ if (R.mayWriteToMemory() && !IR)
+ return;
+
+ if (!IR)
+ continue;
+
+ if (!isConsecutiveInterleaveGroup(IR, VF))
+ return;
+ if (IR->getStoredValues().empty())
+ continue;
+
+ auto *Lane0 = dyn_cast_or_null<VPWidenRecipe>(
----------------
ayalz wrote:
```suggestion
auto *WidenMember0 = dyn_cast_or_null<VPWidenRecipe>(
```
? Although there are admittedly VF members.
https://github.com/llvm/llvm-project/pull/106441
More information about the llvm-commits
mailing list