Skip to content

Commit fec503d

Browse files
committed
[SLP][NFC]Add safe createExtractVector and use instead Builder.CreateExtractVector
1 parent eddeb36 commit fec503d

File tree

1 file changed

+19
-4
lines changed

1 file changed

+19
-4
lines changed

llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4995,6 +4995,23 @@ static Value *createInsertVector(
49954995
return Vec;
49964996
}
49974997

4998+
/// Correctly creates extract_subvector, checking that the index is multiple of
4999+
/// the subvectors length. Otherwise, generates shuffle using \p Generator or
5000+
/// using default shuffle.
5001+
static Value *createExtractVector(IRBuilderBase &Builder, Value *Vec,
5002+
unsigned SubVecVF, unsigned Index) {
5003+
if (Index % SubVecVF == 0) {
5004+
VectorType *SubVecTy =
5005+
getWidenedType(Vec->getType()->getScalarType(), SubVecVF);
5006+
return Builder.CreateExtractVector(SubVecTy, Vec, Builder.getInt64(Index));
5007+
}
5008+
// Create shuffle, extract_subvector requires that index is multiple of
5009+
// the subvector length.
5010+
SmallVector<int> Mask(SubVecVF, PoisonMaskElem);
5011+
std::iota(Mask.begin(), Mask.end(), Index);
5012+
return Builder.CreateShuffleVector(Vec, Mask);
5013+
}
5014+
49985015
BoUpSLP::LoadsState
49995016
BoUpSLP::canVectorizeLoads(ArrayRef<Value *> VL, const Value *VL0,
50005017
SmallVectorImpl<unsigned> &Order,
@@ -16550,10 +16567,8 @@ BoUpSLP::vectorizeTree(const ExtraValueToDebugLocsMap &ExternallyUsedValues,
1655016567
// When REVEC is enabled, we need to extract a vector.
1655116568
// Note: The element size of Scalar may be different from the
1655216569
// element size of Vec.
16553-
Ex = Builder.CreateExtractVector(
16554-
FixedVectorType::get(Vec->getType()->getScalarType(),
16555-
VecTyNumElements),
16556-
Vec, Builder.getInt64(ExternalUse.Lane * VecTyNumElements));
16570+
Ex = createExtractVector(Builder, Vec, VecTyNumElements,
16571+
ExternalUse.Lane * VecTyNumElements);
1655716572
} else {
1655816573
Ex = Builder.CreateExtractElement(Vec, Lane);
1655916574
}

0 commit comments

Comments
 (0)