[llvm] a62c549 - [SLP][REVEC] The vectorized result for ShuffleVector may not be ShuffleVectorInst. (#116940)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Nov 20 07:59:27 PST 2024
Author: Han-Kuan Chen
Date: 2024-11-20T23:59:23+08:00
New Revision: a62c5497c90eb0960860dbc6352e53833d3c407d
URL: https://github.com/llvm/llvm-project/commit/a62c5497c90eb0960860dbc6352e53833d3c407d
DIFF: https://github.com/llvm/llvm-project/commit/a62c5497c90eb0960860dbc6352e53833d3c407d.diff
LOG: [SLP][REVEC] The vectorized result for ShuffleVector may not be ShuffleVectorInst. (#116940)
Added:
Modified:
llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
llvm/test/Transforms/SLPVectorizer/revec-shufflevector.ll
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
index 380b79c4fa377c..47dcde7d9d1899 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);
diff --git a/llvm/test/Transforms/SLPVectorizer/revec-shufflevector.ll b/llvm/test/Transforms/SLPVectorizer/revec-shufflevector.ll
index 8091c218addfab..a2673d81068d8d 100644
--- a/llvm/test/Transforms/SLPVectorizer/revec-shufflevector.ll
+++ b/llvm/test/Transforms/SLPVectorizer/revec-shufflevector.ll
@@ -105,3 +105,19 @@ entry:
store <4 x i32> %2, ptr %6, align 4
ret void
}
+
+define void @test5(ptr %out) {
+; CHECK-LABEL: @test5(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: store <8 x i32> zeroinitializer, ptr [[OUT:%.*]], align 4
+; CHECK-NEXT: ret void
+;
+entry:
+ %0 = shufflevector <8 x i32> zeroinitializer, <8 x i32> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
+ %1 = shufflevector <8 x i32> zeroinitializer, <8 x i32> poison, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
+ %2 = getelementptr inbounds i32, ptr %out, i64 0
+ %3 = getelementptr inbounds i32, ptr %out, i64 4
+ store <4 x i32> %0, ptr %2, align 4
+ store <4 x i32> %1, ptr %3, align 4
+ ret void
+}
More information about the llvm-commits
mailing list