[llvm] c1b911c - [SLP]Do correct signedness analysis for clustered nodes
Alexey Bataev via llvm-commits
llvm-commits at lists.llvm.org
Wed Oct 2 12:59:08 PDT 2024
Author: Alexey Bataev
Date: 2024-10-02T12:56:49-07:00
New Revision: c1b911c5798654b9b77746901919b86b3f1fe94c
URL: https://github.com/llvm/llvm-project/commit/c1b911c5798654b9b77746901919b86b3f1fe94c
DIFF: https://github.com/llvm/llvm-project/commit/c1b911c5798654b9b77746901919b86b3f1fe94c.diff
LOG: [SLP]Do correct signedness analysis for clustered nodes
Should get the signedness info from the original scalar instructions, if
possible, to correctly generate sext/zext instructions. Also, the
clustered node must be assigned a gather node user info to correctly
estimate its bitwidth/sign.
Added:
Modified:
llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
llvm/test/Transforms/SLPVectorizer/X86/subvector-minbitwidth-unsigned-value.ll
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
index 6c14c3f93cde11..af9dfcbbf1170c 100644
--- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
+++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
@@ -9185,12 +9185,13 @@ void BoUpSLP::transformNodes() {
for (unsigned Cnt : Slices) {
ArrayRef<Value *> Slice = VL.slice(Cnt, VF);
// If any instruction is vectorized already - do not try again.
- if (const TreeEntry *SE = getTreeEntry(Slice.front());
+ if (TreeEntry *SE = getTreeEntry(Slice.front());
SE || getTreeEntry(Slice.back())) {
if (!SE)
continue;
if (VF != SE->getVectorFactor() || !SE->isSame(Slice))
continue;
+ SE->UserTreeIndices.emplace_back(&E, UINT_MAX);
AddCombinedNode(SE->Idx, Cnt);
continue;
}
@@ -13446,7 +13447,12 @@ class BoUpSLP::ShuffleInstructionBuilder final : public BaseShuffleAnalysis {
if (CommonMask[Idx] != PoisonMaskElem)
CommonMask[Idx] = Idx;
for (auto [E, Idx] : SubVectors) {
- Value *V = castToScalarTyElem(E->VectorizedValue);
+ Value *V = E->VectorizedValue;
+ if (V->getType()->isIntOrIntVectorTy())
+ V = castToScalarTyElem(V, any_of(E->Scalars, [&](Value *V) {
+ return !isKnownNonNegative(
+ V, SimplifyQuery(*R.DL));
+ }));
Vec = Builder.CreateInsertVector(Vec->getType(), Vec, V,
Builder.getInt64(Idx));
if (!CommonMask.empty()) {
diff --git a/llvm/test/Transforms/SLPVectorizer/X86/subvector-minbitwidth-unsigned-value.ll b/llvm/test/Transforms/SLPVectorizer/X86/subvector-minbitwidth-unsigned-value.ll
index e99d042fd9c569..2f126df81f2305 100644
--- a/llvm/test/Transforms/SLPVectorizer/X86/subvector-minbitwidth-unsigned-value.ll
+++ b/llvm/test/Transforms/SLPVectorizer/X86/subvector-minbitwidth-unsigned-value.ll
@@ -14,7 +14,7 @@ define i1 @test(i64 %v1, ptr %v2, i32 %v3, i1 %v4) {
; CHECK-NEXT: [[TMP6:%.*]] = icmp eq <2 x i32> [[TMP5]], zeroinitializer
; CHECK-NEXT: [[TMP7:%.*]] = insertelement <4 x i32> poison, i32 [[V3]], i32 0
; CHECK-NEXT: [[TMP8:%.*]] = shufflevector <4 x i32> [[TMP7]], <4 x i32> poison, <4 x i32> <i32 poison, i32 poison, i32 0, i32 0>
-; CHECK-NEXT: [[TMP9:%.*]] = sext <2 x i8> [[TMP4]] to <2 x i32>
+; CHECK-NEXT: [[TMP9:%.*]] = zext <2 x i8> [[TMP4]] to <2 x i32>
; CHECK-NEXT: [[TMP10:%.*]] = call <4 x i32> @llvm.vector.insert.v4i32.v2i32(<4 x i32> [[TMP8]], <2 x i32> [[TMP9]], i64 0)
; CHECK-NEXT: [[TMP11:%.*]] = uitofp <4 x i32> [[TMP10]] to <4 x float>
; CHECK-NEXT: [[TMP12:%.*]] = fdiv <4 x float> zeroinitializer, [[TMP11]]
More information about the llvm-commits
mailing list