@@ -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+
49985015BoUpSLP::LoadsState
49995016BoUpSLP::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