@@ -10149,6 +10149,9 @@ class BoUpSLP::ShuffleInstructionBuilder final : public BaseShuffleAnalysis {
10149
10149
continue;
10150
10150
auto *EI = cast<ExtractElementInst>(E->Scalars[I]);
10151
10151
VecBase = EI->getVectorOperand();
10152
+ if (const TreeEntry *TE = R.getTreeEntry(VecBase))
10153
+ VecBase = TE->VectorizedValue;
10154
+ assert(VecBase && "Expected vectorized value.");
10152
10155
UniqueBases.insert(VecBase);
10153
10156
// If the only one use is vectorized - can delete the extractelement
10154
10157
// itself.
@@ -10186,6 +10189,9 @@ class BoUpSLP::ShuffleInstructionBuilder final : public BaseShuffleAnalysis {
10186
10189
if (SubMask[I] == PoisonMaskElem)
10187
10190
continue;
10188
10191
Value *VecOp = cast<ExtractElementInst>(V)->getVectorOperand();
10192
+ if (const TreeEntry *TE = R.getTreeEntry(VecOp))
10193
+ VecOp = TE->VectorizedValue;
10194
+ assert(VecOp && "Expected vectorized value.");
10189
10195
const int Size =
10190
10196
cast<FixedVectorType>(VecOp->getType())->getNumElements();
10191
10197
#ifndef NDEBUG
@@ -10593,6 +10599,21 @@ ResTy BoUpSLP::processBuildVector(const TreeEntry *E, Args &...Params) {
10593
10599
ExtractShuffles =
10594
10600
tryToGatherExtractElements(GatheredScalars, ExtractMask, NumParts);
10595
10601
if (!ExtractShuffles.empty()) {
10602
+ SmallVector<const TreeEntry *> ExtractEntries;
10603
+ for (auto [Idx, I] : enumerate(ExtractMask)) {
10604
+ if (I == PoisonMaskElem)
10605
+ continue;
10606
+ if (const auto *TE = getTreeEntry(
10607
+ cast<ExtractElementInst>(E->Scalars[Idx])->getVectorOperand()))
10608
+ ExtractEntries.push_back(TE);
10609
+ }
10610
+ if (Value *Delayed = ShuffleBuilder.needToDelay(E, ExtractEntries)) {
10611
+ // Delay emission of gathers which are not ready yet.
10612
+ PostponedGathers.insert(E);
10613
+ // Postpone gather emission, will be emitted after the end of the
10614
+ // process to keep correct order.
10615
+ return Delayed;
10616
+ }
10596
10617
if (Value *VecBase = ShuffleBuilder.adjustExtracts(
10597
10618
E, ExtractMask, NumParts, UseVecBaseAsInput)) {
10598
10619
ExtractVecBase = VecBase;
@@ -10779,12 +10800,16 @@ ResTy BoUpSLP::processBuildVector(const TreeEntry *E, Args &...Params) {
10779
10800
if (isa<UndefValue>(E->Scalars[I]))
10780
10801
continue;
10781
10802
auto *EI = cast<ExtractElementInst>(E->Scalars[I]);
10803
+ Value *VecOp = EI->getVectorOperand();
10804
+ if (const auto *TE = getTreeEntry(VecOp))
10805
+ if (TE->VectorizedValue)
10806
+ VecOp = TE->VectorizedValue;
10782
10807
if (!Vec1) {
10783
- Vec1 = EI->getVectorOperand() ;
10808
+ Vec1 = VecOp ;
10784
10809
} else if (Vec1 != EI->getVectorOperand()) {
10785
10810
assert((!Vec2 || Vec2 == EI->getVectorOperand()) &&
10786
10811
"Expected only 1 or 2 vectors shuffle.");
10787
- Vec2 = EI->getVectorOperand() ;
10812
+ Vec2 = VecOp ;
10788
10813
}
10789
10814
}
10790
10815
}
0 commit comments