-
Notifications
You must be signed in to change notification settings - Fork 13.6k
[SLP][REVEC] Use VL.front()->getType() as ScalarTy. #102437
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[SLP][REVEC] Use VL.front()->getType() as ScalarTy. #102437
Conversation
@llvm/pr-subscribers-llvm-transforms Author: Han-Kuan Chen (HanKuanChen) ChangesFull diff: https://github.com/llvm/llvm-project/pull/102437.diff 2 Files Affected:
diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
index 7619e744f7a2f..1956e7f961837 100644
--- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
+++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
@@ -12391,8 +12391,8 @@ Value *BoUpSLP::vectorizeOperand(TreeEntry *E, unsigned NodeIdx,
}
if (IsSameVE) {
auto FinalShuffle = [&](Value *V, ArrayRef<int> Mask) {
- ShuffleInstructionBuilder ShuffleBuilder(
- cast<VectorType>(V->getType())->getElementType(), Builder, *this);
+ ShuffleInstructionBuilder ShuffleBuilder(VL.front()->getType(), 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 d6dd4128de9c7..f457042d93114 100644
--- a/llvm/test/Transforms/SLPVectorizer/revec.ll
+++ b/llvm/test/Transforms/SLPVectorizer/revec.ll
@@ -124,3 +124,37 @@ entry:
store <8 x i1> %6, ptr %7, align 1
ret void
}
+
+define void @test5() {
+; CHECK-LABEL: @test5(
+; 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 [[FOR_COND_CLEANUP_LOOPEXIT_UNR_LCSSA:%.*]], label [[FOR_BODY:%.*]]
+; CHECK: for.cond.cleanup.loopexit.unr-lcssa:
+; 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 [[FOR_COND_CLEANUP_LOOPEXIT_UNR_LCSSA]], label [[FOR_BODY]]
+;
+entry:
+ br i1 false, label %for.cond.cleanup.loopexit.unr-lcssa, label %for.body
+
+for.cond.cleanup.loopexit.unr-lcssa: ; preds = %for.body, %entry
+ %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: ; preds = %for.body, %entry
+ %4 = phi <2 x float> [ %4, %for.body ], [ zeroinitializer, %entry ]
+ %5 = phi <2 x float> [ %5, %for.body ], [ zeroinitializer, %entry ]
+ br i1 false, label %for.cond.cleanup.loopexit.unr-lcssa, label %for.body
+}
|
@@ -12391,8 +12391,8 @@ Value *BoUpSLP::vectorizeOperand(TreeEntry *E, unsigned NodeIdx, | |||
} | |||
if (IsSameVE) { | |||
auto FinalShuffle = [&](Value *V, ArrayRef<int> Mask) { | |||
ShuffleInstructionBuilder ShuffleBuilder( | |||
cast<VectorType>(V->getType())->getElementType(), Builder, *this); | |||
ShuffleInstructionBuilder ShuffleBuilder(VL.front()->getType(), Builder, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What of the type is affected by MinBitwidth analysis?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ShuffleInstructionBuilder::add
will call castToScalarTyElem
.
If V
is affected by MinBWs
, then castToScalarTyElem
will use CreateIntCast
and make V
have a same type as VL.front()->getType()
.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
But it will add extra cost. Do you include the cost of such a cast in the cost model?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The vectorizeTree
can handles MinBWs
well. The VecTy
in vectorizeTree
consider the MinBWs
. If the return value from vectorizeOperand
does not have VecTy
type, it will be cast back to MinBWs
width.
Since there is two casting, the following optimization passes should eliminate the castings easily.
I think we don't need to change the cost model here.
But to make things simple, how about this 761040e?
ee9b5dc
to
761040e
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LG
VL.front()->getType() may be FixedVectorType when revec is enabled. Fix "Expected item in MinBWs.".
761040e
to
3ef091e
Compare
VL.front()->getType() may be FixedVectorType when revec is enabled.
Fix "Expected item in MinBWs.".