[llvm] [VPlan] Strip WidenStore handling in narrowToSingleScalars (PR #184765)
Ramkumar Ramachandra via llvm-commits
llvm-commits at lists.llvm.org
Thu Apr 2 03:19:36 PDT 2026
https://github.com/artagnon updated https://github.com/llvm/llvm-project/pull/184765
>From 27448d198d7ae8947c23a02987e0664a7bde11de Mon Sep 17 00:00:00 2001
From: Ramkumar Ramachandra <artagnon at tenstorrent.com>
Date: Thu, 5 Mar 2026 10:17:19 +0000
Subject: [PATCH] [VPlan] Strip WidenStore handling in narrowToSingleScalars
Although the codepath seems to be reached in a few cases, it doesn't
seem to be making any changes: what matters is that the operands of the
WidenStore are narrowed to single-scalars maximally.
---
.../Transforms/Vectorize/VPlanTransforms.cpp | 38 ++-----------------
1 file changed, 3 insertions(+), 35 deletions(-)
diff --git a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
index 9944df4778774..900ea5020558a 100644
--- a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
+++ b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
@@ -1799,45 +1799,13 @@ static void narrowToSingleScalarRecipes(VPlan &Plan) {
for (VPBasicBlock *VPBB : VPBlockUtils::blocksOnly<VPBasicBlock>(
vp_depth_first_shallow(Plan.getVectorLoopRegion()->getEntry()))) {
for (VPRecipeBase &R : make_early_inc_range(reverse(*VPBB))) {
- if (!isa<VPWidenRecipe, VPWidenGEPRecipe, VPReplicateRecipe,
- VPWidenStoreRecipe>(&R))
+ if (!isa<VPWidenRecipe, VPWidenGEPRecipe, VPReplicateRecipe>(&R))
continue;
auto *RepR = dyn_cast<VPReplicateRecipe>(&R);
if (RepR && (RepR->isSingleScalar() || RepR->isPredicated()))
continue;
- // Convert an unmasked scatter with an uniform address into
- // extract-last-lane + scalar store.
- // TODO: Add a profitability check comparing the cost of a scatter vs.
- // extract + scalar store.
- auto *WidenStoreR = dyn_cast<VPWidenStoreRecipe>(&R);
- if (WidenStoreR && vputils::isSingleScalar(WidenStoreR->getAddr()) &&
- !WidenStoreR->isConsecutive()) {
- assert(!WidenStoreR->isReverse() &&
- "Not consecutive memory recipes shouldn't be reversed");
- VPValue *Mask = WidenStoreR->getMask();
-
- // Only convert the scatter to a scalar store if it is unmasked.
- // TODO: Support converting scatter masked by the header mask to scalar
- // store.
- if (Mask)
- continue;
-
- auto *Extract = new VPInstruction(VPInstruction::ExtractLastLane,
- {WidenStoreR->getOperand(1)});
- Extract->insertBefore(WidenStoreR);
-
- // TODO: Sink the scalar store recipe to middle block if possible.
- auto *ScalarStore = new VPReplicateRecipe(
- &WidenStoreR->getIngredient(), {Extract, WidenStoreR->getAddr()},
- true /*IsSingleScalar*/, nullptr /*Mask*/, {},
- *WidenStoreR /*Metadata*/);
- ScalarStore->insertBefore(WidenStoreR);
- WidenStoreR->eraseFromParent();
- continue;
- }
-
- auto *RepOrWidenR = dyn_cast<VPRecipeWithIRFlags>(&R);
+ auto *RepOrWidenR = cast<VPRecipeWithIRFlags>(&R);
if (RepR && isa<StoreInst>(RepR->getUnderlyingInstr()) &&
vputils::isSingleScalar(RepR->getOperand(1))) {
auto *Clone = new VPReplicateRecipe(
@@ -1858,7 +1826,7 @@ static void narrowToSingleScalarRecipes(VPlan &Plan) {
}
// Skip recipes that aren't single scalars.
- if (!RepOrWidenR || !vputils::isSingleScalar(RepOrWidenR))
+ if (!vputils::isSingleScalar(RepOrWidenR))
continue;
// Predicate to check if a user of Op introduces extra broadcasts.
More information about the llvm-commits
mailing list