diff options
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp index 380b79c..47dcde7 100644 --- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp +++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp @@ -15716,16 +15716,18 @@ Value *BoUpSLP::vectorizeTree(TreeEntry *E, bool PostponedPHIs) { LLVM_DEBUG(dbgs() << "SLP: Diamond merged for " << *VL0 << ".\n"); return E->VectorizedValue; } - assert(isa<ShuffleVectorInst>(Src) && - "Not supported shufflevector usage."); - auto *SVSrc = cast<ShuffleVectorInst>(Src); - assert(isa<PoisonValue>(SVSrc->getOperand(1)) && - "Not supported shufflevector usage."); SmallVector<int> ThisMask(calculateShufflevectorMask(E->Scalars)); - SmallVector<int> NewMask(ThisMask.size()); - transform(ThisMask, NewMask.begin(), - [&SVSrc](int Mask) { return SVSrc->getShuffleMask()[Mask]; }); - V = Builder.CreateShuffleVector(SVSrc->getOperand(0), NewMask); + if (auto *SVSrc = dyn_cast<ShuffleVectorInst>(Src)) { + assert(isa<PoisonValue>(SVSrc->getOperand(1)) && + "Not supported shufflevector usage."); + SmallVector<int> NewMask(ThisMask.size()); + transform(ThisMask, NewMask.begin(), [&SVSrc](int Mask) { + return SVSrc->getShuffleMask()[Mask]; + }); + V = Builder.CreateShuffleVector(SVSrc->getOperand(0), NewMask); + } else { + V = Builder.CreateShuffleVector(Src, ThisMask); + } propagateIRFlags(V, E->Scalars, VL0); if (auto *I = dyn_cast<Instruction>(V)) V = propagateMetadata(I, E->Scalars); |
