[llvm] 2256d00 - [SLP][REVEC] Use VL.front()->getType() as ScalarTy. (#102437)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Aug 13 04:53:49 PDT 2024
Author: Han-Kuan Chen
Date: 2024-08-13T19:53:45+08:00
New Revision: 2256d00a1445e751f20040cb4292aa325dd83c8e
URL: https://github.com/llvm/llvm-project/commit/2256d00a1445e751f20040cb4292aa325dd83c8e
DIFF: https://github.com/llvm/llvm-project/commit/2256d00a1445e751f20040cb4292aa325dd83c8e.diff
LOG: [SLP][REVEC] Use VL.front()->getType() as ScalarTy. (#102437)
VL.front()->getType() may be FixedVectorType when revec is enabled.
Fix "Expected item in MinBWs.".
Added:
Modified:
llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
llvm/test/Transforms/SLPVectorizer/revec.ll
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
index 39cfd08976b482..8a08d766a8ed47 100644
--- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
+++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
@@ -12586,8 +12586,15 @@ Value *BoUpSLP::vectorizeOperand(TreeEntry *E, unsigned NodeIdx,
}
if (IsSameVE) {
auto FinalShuffle = [&](Value *V, ArrayRef<int> Mask) {
+ // V may be affected by MinBWs.
+ // We want ShuffleInstructionBuilder to correctly support REVEC. The key
+ // factor is the number of elements, not their type.
+ Type *ScalarTy = cast<VectorType>(V->getType())->getElementType();
+ unsigned NumElements = getNumElements(VL.front()->getType());
ShuffleInstructionBuilder ShuffleBuilder(
- cast<VectorType>(V->getType())->getElementType(), Builder, *this);
+ NumElements != 1 ? FixedVectorType::get(ScalarTy, NumElements)
+ : ScalarTy,
+ Builder, *this);
ShuffleBuilder.add(V, Mask);
return ShuffleBuilder.finalize(std::nullopt);
};
diff --git a/llvm/test/Transforms/SLPVectorizer/revec.ll b/llvm/test/Transforms/SLPVectorizer/revec.ll
index 9c8a98ba47b621..9ce9db1d360cc3 100644
--- a/llvm/test/Transforms/SLPVectorizer/revec.ll
+++ b/llvm/test/Transforms/SLPVectorizer/revec.ll
@@ -238,3 +238,37 @@ define void @test7() {
store <8 x i16> %3, ptr null, align 2
ret void
}
+
+define void @test8() {
+; CHECK-LABEL: @test8(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: [[TMP0:%.*]] = call <8 x float> @llvm.vector.insert.v8f32.v2f32(<8 x float> poison, <2 x float> zeroinitializer, i64 0)
+; CHECK-NEXT: [[TMP1:%.*]] = call <8 x float> @llvm.vector.insert.v8f32.v2f32(<8 x float> [[TMP0]], <2 x float> zeroinitializer, i64 2)
+; CHECK-NEXT: [[TMP2:%.*]] = call <8 x float> @llvm.vector.insert.v8f32.v2f32(<8 x float> [[TMP1]], <2 x float> zeroinitializer, i64 4)
+; CHECK-NEXT: [[TMP3:%.*]] = call <8 x float> @llvm.vector.insert.v8f32.v2f32(<8 x float> [[TMP2]], <2 x float> zeroinitializer, i64 6)
+; CHECK-NEXT: [[TMP4:%.*]] = call <4 x float> @llvm.vector.insert.v4f32.v2f32(<4 x float> poison, <2 x float> zeroinitializer, i64 0)
+; CHECK-NEXT: [[TMP5:%.*]] = call <4 x float> @llvm.vector.insert.v4f32.v2f32(<4 x float> [[TMP4]], <2 x float> zeroinitializer, i64 2)
+; CHECK-NEXT: br i1 false, label [[FOR0:%.*]], label [[FOR_BODY:%.*]]
+; CHECK: for0:
+; CHECK-NEXT: [[TMP6:%.*]] = phi <8 x float> [ [[TMP3]], [[ENTRY:%.*]] ], [ [[TMP8:%.*]], [[FOR_BODY]] ]
+; CHECK-NEXT: ret void
+; CHECK: for.body:
+; CHECK-NEXT: [[TMP7:%.*]] = phi <4 x float> [ [[TMP7]], [[FOR_BODY]] ], [ [[TMP5]], [[ENTRY]] ]
+; CHECK-NEXT: [[TMP8]] = shufflevector <4 x float> [[TMP7]], <4 x float> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3>
+; CHECK-NEXT: br i1 false, label [[FOR0]], label [[FOR_BODY]]
+;
+entry:
+ br i1 false, label %for0, label %for.body
+
+for0:
+ %0 = phi <2 x float> [ zeroinitializer, %entry ], [ %4, %for.body ]
+ %1 = phi <2 x float> [ zeroinitializer, %entry ], [ %5, %for.body ]
+ %2 = phi <2 x float> [ zeroinitializer, %entry ], [ %4, %for.body ]
+ %3 = phi <2 x float> [ zeroinitializer, %entry ], [ %5, %for.body ]
+ ret void
+
+for.body:
+ %4 = phi <2 x float> [ %4, %for.body ], [ zeroinitializer, %entry ]
+ %5 = phi <2 x float> [ %5, %for.body ], [ zeroinitializer, %entry ]
+ br i1 false, label %for0, label %for.body
+}
More information about the llvm-commits
mailing list