Skip to content

Commit 6c787ff

Browse files
committed
Revert "[LV]: Teach LV to recursively (de)interleave. (#122989)"
This reverts commit 9491f75. This triggers an assert when building with SVE enabled. https://lab.llvm.org/buildbot/#/builders/143/builds/4795
1 parent 733a98d commit 6c787ff

File tree

6 files changed

+671
-1387
lines changed

6 files changed

+671
-1387
lines changed

llvm/lib/Transforms/Vectorize/LoopVectorize.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3388,10 +3388,10 @@ bool LoopVectorizationCostModel::interleavedAccessCanBeWidened(
33883388
if (hasIrregularType(ScalarTy, DL))
33893389
return false;
33903390

3391-
// For scalable vectors, the only interleave factor currently supported
3392-
// must be power of 2 since we require the (de)interleave2 intrinsics
3393-
// instead of shufflevectors.
3394-
if (VF.isScalable() && !isPowerOf2_32(InterleaveFactor))
3391+
// We currently only know how to emit interleave/deinterleave with
3392+
// Factor=2 for scalable vectors. This is purely an implementation
3393+
// limit.
3394+
if (VF.isScalable() && InterleaveFactor != 2)
33953395
return false;
33963396

33973397
// If the group involves a non-integral pointer, we may not be able to
@@ -9262,9 +9262,9 @@ LoopVectorizationPlanner::tryToBuildVPlanWithVPRecipes(VFRange &Range) {
92629262
CM.getWideningDecision(IG->getInsertPos(), VF) ==
92639263
LoopVectorizationCostModel::CM_Interleave);
92649264
// For scalable vectors, the only interleave factor currently supported
9265-
// must be power of 2 since we require the (de)interleave2 intrinsics
9266-
// instead of shufflevectors.
9267-
assert((!Result || !VF.isScalable() || isPowerOf2_32(IG->getFactor())) &&
9265+
// is 2 since we require the (de)interleave2 intrinsics instead of
9266+
// shufflevectors.
9267+
assert((!Result || !VF.isScalable() || IG->getFactor() == 2) &&
92689268
"Unsupported interleave factor for scalable vectors");
92699269
return Result;
92709270
};

llvm/lib/Transforms/Vectorize/VPlanRecipes.cpp

Lines changed: 23 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -2855,21 +2855,10 @@ static Value *interleaveVectors(IRBuilderBase &Builder, ArrayRef<Value *> Vals,
28552855
// Scalable vectors cannot use arbitrary shufflevectors (only splats), so
28562856
// must use intrinsics to interleave.
28572857
if (VecTy->isScalableTy()) {
2858-
assert(isPowerOf2_32(Factor) && "Unsupported interleave factor for "
2859-
"scalable vectors, must be power of 2");
2860-
SmallVector<Value *> InterleavingValues(Vals);
2861-
// When interleaving, the number of values will be shrunk until we have the
2862-
// single final interleaved value.
2863-
auto *InterleaveTy = cast<VectorType>(InterleavingValues[0]->getType());
2864-
for (unsigned Midpoint = Factor / 2; Midpoint > 0; Midpoint /= 2) {
2865-
InterleaveTy = VectorType::getDoubleElementsVectorType(InterleaveTy);
2866-
for (unsigned I = 0; I < Midpoint; ++I)
2867-
InterleavingValues[I] = Builder.CreateIntrinsic(
2868-
InterleaveTy, Intrinsic::vector_interleave2,
2869-
{InterleavingValues[I], InterleavingValues[Midpoint + I]},
2870-
/*FMFSource=*/nullptr, Name);
2871-
}
2872-
return InterleavingValues[0];
2858+
VectorType *WideVecTy = VectorType::getDoubleElementsVectorType(VecTy);
2859+
return Builder.CreateIntrinsic(WideVecTy, Intrinsic::vector_interleave2,
2860+
Vals,
2861+
/*FMFSource=*/nullptr, Name);
28732862
}
28742863

28752864
// Fixed length. Start by concatenating all vectors into a wide vector.
@@ -2955,11 +2944,15 @@ void VPInterleaveRecipe::execute(VPTransformState &State) {
29552944
&InterleaveFactor](Value *MaskForGaps) -> Value * {
29562945
if (State.VF.isScalable()) {
29572946
assert(!MaskForGaps && "Interleaved groups with gaps are not supported.");
2958-
assert(isPowerOf2_32(InterleaveFactor) &&
2947+
assert(InterleaveFactor == 2 &&
29592948
"Unsupported deinterleave factor for scalable vectors");
29602949
auto *ResBlockInMask = State.get(BlockInMask);
2961-
SmallVector<Value *> Ops(InterleaveFactor, ResBlockInMask);
2962-
return interleaveVectors(State.Builder, Ops, "interleaved.mask");
2950+
SmallVector<Value *, 2> Ops = {ResBlockInMask, ResBlockInMask};
2951+
auto *MaskTy = VectorType::get(State.Builder.getInt1Ty(),
2952+
State.VF.getKnownMinValue() * 2, true);
2953+
return State.Builder.CreateIntrinsic(
2954+
MaskTy, Intrinsic::vector_interleave2, Ops,
2955+
/*FMFSource=*/nullptr, "interleaved.mask");
29632956
}
29642957

29652958
if (!BlockInMask)
@@ -2999,48 +2992,22 @@ void VPInterleaveRecipe::execute(VPTransformState &State) {
29992992
ArrayRef<VPValue *> VPDefs = definedValues();
30002993
const DataLayout &DL = State.CFG.PrevBB->getDataLayout();
30012994
if (VecTy->isScalableTy()) {
3002-
assert(isPowerOf2_32(InterleaveFactor) &&
2995+
assert(InterleaveFactor == 2 &&
30032996
"Unsupported deinterleave factor for scalable vectors");
30042997

3005-
// Scalable vectors cannot use arbitrary shufflevectors (only splats),
3006-
// so must use intrinsics to deinterleave.
3007-
SmallVector<Value *> DeinterleavedValues(InterleaveFactor);
3008-
DeinterleavedValues[0] = NewLoad;
3009-
// For the case of InterleaveFactor > 2, we will have to do recursive
3010-
// deinterleaving, because the current available deinterleave intrinsic
3011-
// supports only Factor of 2, otherwise it will bailout after first
3012-
// iteration.
3013-
// When deinterleaving, the number of values will double until we
3014-
// have "InterleaveFactor".
3015-
for (unsigned NumVectors = 1; NumVectors < InterleaveFactor;
3016-
NumVectors *= 2) {
3017-
// Deinterleave the elements within the vector
3018-
SmallVector<Value *> TempDeinterleavedValues(NumVectors);
3019-
for (unsigned I = 0; I < NumVectors; ++I) {
3020-
auto *DiTy = DeinterleavedValues[I]->getType();
3021-
TempDeinterleavedValues[I] = State.Builder.CreateIntrinsic(
3022-
Intrinsic::vector_deinterleave2, DiTy, DeinterleavedValues[I],
3023-
/*FMFSource=*/nullptr, "strided.vec");
3024-
}
3025-
// Extract the deinterleaved values:
3026-
for (unsigned I = 0; I < 2; ++I)
3027-
for (unsigned J = 0; J < NumVectors; ++J)
3028-
DeinterleavedValues[NumVectors * I + J] =
3029-
State.Builder.CreateExtractValue(TempDeinterleavedValues[J], I);
3030-
}
3031-
3032-
#ifndef NDEBUG
3033-
for (Value *Val : DeinterleavedValues)
3034-
assert(Val && "NULL Deinterleaved Value");
3035-
#endif
3036-
for (unsigned I = 0, J = 0; I < InterleaveFactor; ++I) {
2998+
// Scalable vectors cannot use arbitrary shufflevectors (only splats),
2999+
// so must use intrinsics to deinterleave.
3000+
Value *DI = State.Builder.CreateIntrinsic(
3001+
Intrinsic::vector_deinterleave2, VecTy, NewLoad,
3002+
/*FMFSource=*/nullptr, "strided.vec");
3003+
unsigned J = 0;
3004+
for (unsigned I = 0; I < InterleaveFactor; ++I) {
30373005
Instruction *Member = Group->getMember(I);
3038-
Value *StridedVec = DeinterleavedValues[I];
3039-
if (!Member) {
3040-
// This value is not needed as it's not used
3041-
cast<Instruction>(StridedVec)->eraseFromParent();
3006+
3007+
if (!Member)
30423008
continue;
3043-
}
3009+
3010+
Value *StridedVec = State.Builder.CreateExtractValue(DI, I);
30443011
// If this member has different type, cast the result type.
30453012
if (Member->getType() != ScalarTy) {
30463013
VectorType *OtherVTy = VectorType::get(Member->getType(), State.VF);

0 commit comments

Comments
 (0)