[llvm] f6e01b9 - [SLP]Do not trunc bv nodes, if the user is vectorized an requires wider type.
Alexey Bataev via llvm-commits
llvm-commits at lists.llvm.org
Fri Jul 19 07:30:49 PDT 2024
Author: Alexey Bataev
Date: 2024-07-19T07:28:04-07:00
New Revision: f6e01b9ece1e73f6eda6e1dbff3aa72e917f4007
URL: https://github.com/llvm/llvm-project/commit/f6e01b9ece1e73f6eda6e1dbff3aa72e917f4007
DIFF: https://github.com/llvm/llvm-project/commit/f6e01b9ece1e73f6eda6e1dbff3aa72e917f4007.diff
LOG: [SLP]Do not trunc bv nodes, if the user is vectorized an requires wider type.
If at least a single user of the gathered trunc'ed instruction is
vectorized and requires wider type, than the trunc node, such
gathers/buildvectors should not be optimized for better bitwidth.
Added:
Modified:
llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
llvm/test/Transforms/SLPVectorizer/RISCV/trunc-bv-multi-uses.ll
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
index bf2f2c334e4c1..667c4eb311c22 100644
--- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
+++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
@@ -15529,7 +15529,23 @@ void BoUpSLP::computeMinimumValueSizes() {
// Check if the root is trunc and the next node is gather/buildvector, then
// keep trunc in scalars, which is free in most cases.
if (E.isGather() && IsTruncRoot && E.UserTreeIndices.size() == 1 &&
- E.Idx > (IsStoreOrInsertElt ? 2 : 1)) {
+ E.Idx > (IsStoreOrInsertElt ? 2 : 1) &&
+ all_of(E.Scalars, [&](Value *V) {
+ return V->hasOneUse() || isa<Constant>(V) ||
+ (!V->hasNUsesOrMore(UsesLimit) &&
+ none_of(V->users(), [&](User *U) {
+ const TreeEntry *TE = getTreeEntry(U);
+ const TreeEntry *UserTE = E.UserTreeIndices.back().UserTE;
+ if (TE == UserTE || !TE)
+ return false;
+ unsigned UserTESz = DL->getTypeSizeInBits(
+ UserTE->Scalars.front()->getType());
+ auto It = MinBWs.find(TE);
+ if (It != MinBWs.end() && It->second.first > UserTESz)
+ return true;
+ return DL->getTypeSizeInBits(U->getType()) > UserTESz;
+ }));
+ })) {
ToDemote.push_back(E.Idx);
const TreeEntry *UserTE = E.UserTreeIndices.back().UserTE;
auto It = MinBWs.find(UserTE);
diff --git a/llvm/test/Transforms/SLPVectorizer/RISCV/trunc-bv-multi-uses.ll b/llvm/test/Transforms/SLPVectorizer/RISCV/trunc-bv-multi-uses.ll
index 53acc37155c9f..3ca5733a6bad0 100644
--- a/llvm/test/Transforms/SLPVectorizer/RISCV/trunc-bv-multi-uses.ll
+++ b/llvm/test/Transforms/SLPVectorizer/RISCV/trunc-bv-multi-uses.ll
@@ -8,8 +8,7 @@ define i32 @test(i64 %v1, i64 %v2) {
; CHECK-NEXT: [[TMP0:%.*]] = insertelement <2 x i64> poison, i64 [[V1]], i32 0
; CHECK-NEXT: [[TMP1:%.*]] = insertelement <2 x i64> [[TMP0]], i64 [[V2]], i32 1
; CHECK-NEXT: [[TMP2:%.*]] = trunc <2 x i64> [[TMP1]] to <2 x i32>
-; CHECK-NEXT: [[TMP3:%.*]] = sext <2 x i32> [[TMP2]] to <2 x i64>
-; CHECK-NEXT: [[TMP4:%.*]] = lshr <2 x i64> [[TMP3]], <i64 32, i64 32>
+; CHECK-NEXT: [[TMP4:%.*]] = lshr <2 x i64> [[TMP1]], <i64 32, i64 32>
; CHECK-NEXT: [[TMP5:%.*]] = trunc <2 x i64> [[TMP4]] to <2 x i32>
; CHECK-NEXT: [[TMP6:%.*]] = add <2 x i32> [[TMP2]], [[TMP5]]
; CHECK-NEXT: [[TMP7:%.*]] = extractelement <2 x i32> [[TMP6]], i32 0
More information about the llvm-commits
mailing list