[llvm] [LV] Explicitly disallow interleaved access requiring gap mask for scalable VFs. nfc (PR #154122)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Aug 18 07:30:53 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-llvm-transforms
Author: Mel Chen (Mel-Chen)
<details>
<summary>Changes</summary>
Currently, VPInterleaveRecipe::execute does not support generating LLVM IR for interleaved accesses that require a gap mask with scalable VFs.
It would be better to detect and prevent such groups from being vectorized as interleaved accesses in LoopVectorizationCostModel::interleavedAccessCanBeWidened, rather than relying on the TTI function getInterleavedMemoryOpCost to return an invalid cost.
---
Full diff: https://github.com/llvm/llvm-project/pull/154122.diff
2 Files Affected:
- (modified) llvm/lib/Transforms/Vectorize/LoopVectorize.cpp (+6)
- (modified) llvm/lib/Transforms/Vectorize/VPlanRecipes.cpp (+2-2)
``````````diff
diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
index 675a230bd2c94..1c08665652e40 100644
--- a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
+++ b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
@@ -3095,6 +3095,12 @@ bool LoopVectorizationCostModel::interleavedAccessCanBeWidened(
if (Group->isReverse())
return false;
+ // TODO: Support interleaved access that requires a gap mask for scalable VFs.
+ bool NeedsMaskForGaps = LoadAccessWithGapsRequiresEpilogMasking ||
+ StoreAccessWithGapsRequiresMasking;
+ if (VF.isScalable() && NeedsMaskForGaps)
+ return false;
+
auto *Ty = getLoadStoreType(I);
const Align Alignment = getLoadStoreAlignment(I);
unsigned AS = getLoadStoreAddressSpace(I);
diff --git a/llvm/lib/Transforms/Vectorize/VPlanRecipes.cpp b/llvm/lib/Transforms/Vectorize/VPlanRecipes.cpp
index 0609510ac8212..2fe0e042c538f 100644
--- a/llvm/lib/Transforms/Vectorize/VPlanRecipes.cpp
+++ b/llvm/lib/Transforms/Vectorize/VPlanRecipes.cpp
@@ -3476,6 +3476,8 @@ static Value *interleaveVectors(IRBuilderBase &Builder, ArrayRef<Value *> Vals,
// store <12 x i32> %interleaved.vec ; Write 4 tuples of R,G,B
void VPInterleaveRecipe::execute(VPTransformState &State) {
assert(!State.Lane && "Interleave group being replicated.");
+ assert((!NeedsMaskForGaps || !State.VF.isScalable()) &&
+ "Masking gaps for scalable vectors is not yet supported.");
const InterleaveGroup<Instruction> *Group = IG;
Instruction *Instr = Group->getInsertPos();
@@ -3593,8 +3595,6 @@ void VPInterleaveRecipe::execute(VPTransformState &State) {
createBitMaskForGaps(State.Builder, State.VF.getKnownMinValue(), *Group);
assert(((MaskForGaps != nullptr) == NeedsMaskForGaps) &&
"Mismatch between NeedsMaskForGaps and MaskForGaps");
- assert((!MaskForGaps || !State.VF.isScalable()) &&
- "masking gaps for scalable vectors is not yet supported.");
ArrayRef<VPValue *> StoredValues = getStoredValues();
// Collect the stored vector from each member.
SmallVector<Value *, 4> StoredVecs;
``````````
</details>
https://github.com/llvm/llvm-project/pull/154122
More information about the llvm-commits
mailing list