@@ -4995,6 +4995,23 @@ static Value *createInsertVector(
4995
4995
return Vec;
4996
4996
}
4997
4997
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
+
4998
5015
BoUpSLP::LoadsState
4999
5016
BoUpSLP::canVectorizeLoads(ArrayRef<Value *> VL, const Value *VL0,
5000
5017
SmallVectorImpl<unsigned> &Order,
@@ -16550,10 +16567,8 @@ BoUpSLP::vectorizeTree(const ExtraValueToDebugLocsMap &ExternallyUsedValues,
16550
16567
// When REVEC is enabled, we need to extract a vector.
16551
16568
// Note: The element size of Scalar may be different from the
16552
16569
// 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);
16557
16572
} else {
16558
16573
Ex = Builder.CreateExtractElement(Vec, Lane);
16559
16574
}
0 commit comments