@@ -1278,6 +1278,17 @@ static SmallBitVector getAltInstrMask(ArrayRef<Value *> VL, Type *ScalarTy,
1278
1278
return OpcodeMask;
1279
1279
}
1280
1280
1281
+ /// Replicates the given \p Val \p VF times.
1282
+ static SmallVector<Constant *> replicateMask(ArrayRef<Constant *> Val,
1283
+ unsigned VF) {
1284
+ assert(none_of(Val, [](Constant *C) { return C->getType()->isVectorTy(); }) &&
1285
+ "Expected scalar constants.");
1286
+ SmallVector<Constant *> NewVal(Val.size() * VF);
1287
+ for (auto [I, V] : enumerate(Val))
1288
+ std::fill_n(NewVal.begin() + I * VF, VF, V);
1289
+ return NewVal;
1290
+ }
1291
+
1281
1292
namespace llvm {
1282
1293
1283
1294
static void inversePermutation(ArrayRef<unsigned> Indices,
@@ -12202,32 +12213,24 @@ class BoUpSLP::ShuffleCostEstimator : public BaseShuffleAnalysis {
12202
12213
unsigned VF = VL.size();
12203
12214
if (MaskVF != 0)
12204
12215
VF = std::min(VF, MaskVF);
12216
+ Type *VLScalarTy = VL.front()->getType();
12205
12217
for (Value *V : VL.take_front(VF)) {
12218
+ Type *ScalarTy = VLScalarTy->getScalarType();
12219
+ if (isa<PoisonValue>(V)) {
12220
+ Vals.push_back(PoisonValue::get(ScalarTy));
12221
+ continue;
12222
+ }
12206
12223
if (isa<UndefValue>(V)) {
12207
- Vals.push_back(cast<Constant>(V ));
12224
+ Vals.push_back(UndefValue::get(ScalarTy ));
12208
12225
continue;
12209
12226
}
12210
- Vals.push_back(Constant::getNullValue(V->getType() ));
12227
+ Vals.push_back(Constant::getNullValue(ScalarTy ));
12211
12228
}
12212
- if (auto *VecTy = dyn_cast<FixedVectorType>(Vals.front()->getType() )) {
12229
+ if (auto *VecTy = dyn_cast<FixedVectorType>(VLScalarTy )) {
12213
12230
assert(SLPReVec && "FixedVectorType is not expected.");
12214
12231
// When REVEC is enabled, we need to expand vector types into scalar
12215
12232
// types.
12216
- unsigned VecTyNumElements = VecTy->getNumElements();
12217
- SmallVector<Constant *> NewVals(VF * VecTyNumElements, nullptr);
12218
- for (auto [I, V] : enumerate(Vals)) {
12219
- Type *ScalarTy = V->getType()->getScalarType();
12220
- Constant *NewVal;
12221
- if (isa<PoisonValue>(V))
12222
- NewVal = PoisonValue::get(ScalarTy);
12223
- else if (isa<UndefValue>(V))
12224
- NewVal = UndefValue::get(ScalarTy);
12225
- else
12226
- NewVal = Constant::getNullValue(ScalarTy);
12227
- std::fill_n(NewVals.begin() + I * VecTyNumElements, VecTyNumElements,
12228
- NewVal);
12229
- }
12230
- Vals.swap(NewVals);
12233
+ Vals = replicateMask(Vals, VecTy->getNumElements());
12231
12234
}
12232
12235
return ConstantVector::get(Vals);
12233
12236
}
@@ -17610,6 +17613,10 @@ Value *BoUpSLP::vectorizeTree(TreeEntry *E) {
17610
17613
ConstantInt::getFalse(VecTy->getContext()));
17611
17614
for (int I : CompressMask)
17612
17615
MaskValues[I] = ConstantInt::getTrue(VecTy->getContext());
17616
+ if (auto *VecTy = dyn_cast<FixedVectorType>(LI->getType())) {
17617
+ assert(SLPReVec && "Only supported by REVEC.");
17618
+ MaskValues = replicateMask(MaskValues, VecTy->getNumElements());
17619
+ }
17613
17620
Constant *MaskValue = ConstantVector::get(MaskValues);
17614
17621
NewLI = Builder.CreateMaskedLoad(LoadVecTy, PO, CommonAlignment,
17615
17622
MaskValue);
@@ -17618,6 +17625,11 @@ Value *BoUpSLP::vectorizeTree(TreeEntry *E) {
17618
17625
}
17619
17626
NewLI = ::propagateMetadata(NewLI, E->Scalars);
17620
17627
// TODO: include this cost into CommonCost.
17628
+ if (auto *VecTy = dyn_cast<FixedVectorType>(LI->getType())) {
17629
+ assert(SLPReVec && "FixedVectorType is not expected.");
17630
+ transformScalarShuffleIndiciesToVector(VecTy->getNumElements(),
17631
+ CompressMask);
17632
+ }
17621
17633
NewLI =
17622
17634
cast<Instruction>(Builder.CreateShuffleVector(NewLI, CompressMask));
17623
17635
} else if (E->State == TreeEntry::StridedVectorize) {
0 commit comments