aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp20
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);