[llvm] [VPlan] Move out canNarrowOps (NFC). (PR #167309)
Florian Hahn via llvm-commits
llvm-commits at lists.llvm.org
Mon Nov 10 08:02:08 PST 2025
https://github.com/fhahn updated https://github.com/llvm/llvm-project/pull/167309
>From b76090e39aa9efb135376ee86fb32eb9b599f8bd Mon Sep 17 00:00:00 2001
From: Florian Hahn <flo at fhahn.com>
Date: Fri, 11 Jul 2025 19:54:49 +0100
Subject: [PATCH 1/2] [VPlan] Move out canNarrowOps (NFC).
---
.../Transforms/Vectorize/VPlanTransforms.cpp | 43 ++++++++++++-------
1 file changed, 28 insertions(+), 15 deletions(-)
diff --git a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
index b319fbc7a78c0..210d372fba66e 100644
--- a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
+++ b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
@@ -4142,6 +4142,32 @@ static bool canNarrowLoad(VPWidenRecipe *WideMember0, unsigned OpIdx,
return false;
}
+static bool canNarrowOps(ArrayRef<VPValue *> Ops) {
+ SmallVector<VPValue *> Ops0;
+ auto *WideMember0 = dyn_cast<VPWidenRecipe>(Ops[0]);
+ if (!WideMember0)
+ return false;
+
+ for (unsigned Idx = 0; Idx != WideMember0->getNumOperands(); ++Idx) {
+ SmallVector<VPValue *> Ops0;
+ for (const auto &[I, V] : enumerate(Ops)) {
+ auto *R = dyn_cast_or_null<VPWidenRecipe>(V->getDefiningRecipe());
+ if (!R || R->getOpcode() != WideMember0->getOpcode() ||
+ R->getNumOperands() > 2)
+ return false;
+
+ Ops0.push_back(R->getOperand(Idx));
+ }
+ if (any_of(enumerate(Ops0), [WideMember0, Idx](const auto &P) {
+ const auto &[OpIdx, OpV] = P;
+ return !canNarrowLoad(WideMember0, Idx, OpV, OpIdx);
+ }))
+ return false;
+ }
+
+ return true;
+}
+
/// Returns true if \p IR is a full interleave group with factor and number of
/// members both equal to \p VF. The interleave group must also access the full
/// vector width \p VectorRegWidth.
@@ -4313,22 +4339,9 @@ void VPlanTransforms::narrowInterleaveGroups(VPlan &Plan, ElementCount VF,
// Check if all values feeding InterleaveR are matching wide recipes, which
// operands that can be narrowed.
- auto *WideMember0 = dyn_cast_or_null<VPWidenRecipe>(
- InterleaveR->getStoredValues()[0]->getDefiningRecipe());
- if (!WideMember0)
+ //
+ if (!canNarrowOps(InterleaveR->getStoredValues()))
return;
- for (const auto &[I, V] : enumerate(InterleaveR->getStoredValues())) {
- auto *R = dyn_cast_or_null<VPWidenRecipe>(V->getDefiningRecipe());
- if (!R || R->getOpcode() != WideMember0->getOpcode() ||
- R->getNumOperands() > 2)
- return;
- if (any_of(enumerate(R->operands()),
- [WideMember0, Idx = I](const auto &P) {
- const auto &[OpIdx, OpV] = P;
- return !canNarrowLoad(WideMember0, OpIdx, OpV, Idx);
- }))
- return;
- }
StoreGroups.push_back(InterleaveR);
}
>From 04f44bfe7f2be4d842e5a0e3b756753330ff370d Mon Sep 17 00:00:00 2001
From: Florian Hahn <flo at fhahn.com>
Date: Mon, 10 Nov 2025 15:52:51 +0000
Subject: [PATCH 2/2] !fixup remove stray //, thanks
---
llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp | 1 -
1 file changed, 1 deletion(-)
diff --git a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
index 210d372fba66e..fd35f6ce2f560 100644
--- a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
+++ b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
@@ -4339,7 +4339,6 @@ void VPlanTransforms::narrowInterleaveGroups(VPlan &Plan, ElementCount VF,
// Check if all values feeding InterleaveR are matching wide recipes, which
// operands that can be narrowed.
- //
if (!canNarrowOps(InterleaveR->getStoredValues()))
return;
StoreGroups.push_back(InterleaveR);
More information about the llvm-commits
mailing list