From 2256d00a1445e751f20040cb4292aa325dd83c8e Mon Sep 17 00:00:00 2001 From: Han-Kuan Chen Date: Tue, 13 Aug 2024 19:53:45 +0800 Subject: [PATCH] [SLP][REVEC] Use VL.front()->getType() as ScalarTy. (#102437) VL.front()->getType() may be FixedVectorType when revec is enabled. Fix "Expected item in MinBWs.". --- .../Transforms/Vectorize/SLPVectorizer.cpp | 9 ++++- llvm/test/Transforms/SLPVectorizer/revec.ll | 34 +++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp index 39cfd08976b4..8a08d766a8ed 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 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(V->getType())->getElementType(); + unsigned NumElements = getNumElements(VL.front()->getType()); ShuffleInstructionBuilder ShuffleBuilder( - cast(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 9c8a98ba47b6..9ce9db1d360c 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> +; 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 +}