From 3ddf49e0673d53b9bd3b42a5c60d9b838a7e78bb Mon Sep 17 00:00:00 2001 From: Mikhail Gudim Date: Wed, 17 Sep 2025 06:43:01 -0700 Subject: [PATCH 1/5] [SLPVectorizer] Move size checks (NFC) Move size checks inside `isStridedLoad`. In the future we plan to possibly change the size and type of strided load there. --- .../Transforms/Vectorize/SLPVectorizer.cpp | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp index 6ac9018df641e..5f5f266284856 100644 --- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp +++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp @@ -2237,8 +2237,7 @@ class BoUpSLP { bool isStridedLoad(ArrayRef VL, ArrayRef PointerOps, ArrayRef Order, const TargetTransformInfo &TTI, const DataLayout &DL, ScalarEvolution &SE, - const bool IsAnyPointerUsedOutGraph, const int64_t Diff, - StridedPtrInfo &SPtrInfo) const; + const int64_t Diff, StridedPtrInfo &SPtrInfo) const; /// Checks if the given array of loads can be represented as a vectorized, /// scatter or just simple gather. @@ -6822,10 +6821,22 @@ bool BoUpSLP::isStridedLoad(ArrayRef VL, ArrayRef PointerOps, ArrayRef Order, const TargetTransformInfo &TTI, const DataLayout &DL, ScalarEvolution &SE, - const bool IsAnyPointerUsedOutGraph, const int64_t Diff, StridedPtrInfo &SPtrInfo) const { const size_t Sz = VL.size(); + // Simple check if not a strided access - clear order. + bool IsPossibleStrided = Diff % (Sz - 1) == 0; + if (!IsPossibleStrided) + return false; + + // Try to generate strided load node. + auto IsAnyPointerUsedOutGraph = + IsPossibleStrided && any_of(PointerOps, [&](Value *V) { + return isa(V) && any_of(V->users(), [&](User *U) { + return !isVectorized(U) && !MustGather.contains(U); + }); + }); + const uint64_t AbsoluteDiff = std::abs(Diff); Type *ScalarTy = VL.front()->getType(); auto *VecTy = getWidenedType(ScalarTy, Sz); @@ -6956,18 +6967,7 @@ BoUpSLP::LoadsState BoUpSLP::canVectorizeLoads( cast(V), UserIgnoreList); })) return LoadsState::CompressVectorize; - // Simple check if not a strided access - clear order. - bool IsPossibleStrided = *Diff % (Sz - 1) == 0; - // Try to generate strided load node. - auto IsAnyPointerUsedOutGraph = - IsPossibleStrided && any_of(PointerOps, [&](Value *V) { - return isa(V) && any_of(V->users(), [&](User *U) { - return !isVectorized(U) && !MustGather.contains(U); - }); - }); - if (IsPossibleStrided && - isStridedLoad(VL, PointerOps, Order, *TTI, *DL, *SE, - IsAnyPointerUsedOutGraph, *Diff, SPtrInfo)) + if (isStridedLoad(VL, PointerOps, Order, *TTI, *DL, *SE, *Diff, SPtrInfo)) return LoadsState::StridedVectorize; } if (!TTI->isLegalMaskedGather(VecTy, CommonAlignment) || From bf62b4fff28869b21078acb1f99039ec913637fb Mon Sep 17 00:00:00 2001 From: Mikhail Gudim Date: Mon, 22 Sep 2025 08:34:35 -0700 Subject: [PATCH 2/5] got rid of "IsPossibleStrided" and a comment. --- llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp index 5f5f266284856..702eca2f2149a 100644 --- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp +++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp @@ -6824,14 +6824,12 @@ bool BoUpSLP::isStridedLoad(ArrayRef VL, ArrayRef PointerOps, const int64_t Diff, StridedPtrInfo &SPtrInfo) const { const size_t Sz = VL.size(); - // Simple check if not a strided access - clear order. - bool IsPossibleStrided = Diff % (Sz - 1) == 0; - if (!IsPossibleStrided) + if (Diff % (Sz - 1) != 0) return false; // Try to generate strided load node. auto IsAnyPointerUsedOutGraph = - IsPossibleStrided && any_of(PointerOps, [&](Value *V) { + Iany_of(PointerOps, [&](Value *V) { return isa(V) && any_of(V->users(), [&](User *U) { return !isVectorized(U) && !MustGather.contains(U); }); From 27dfb3ff8e618278a62447b87a0650755c07bd5c Mon Sep 17 00:00:00 2001 From: Mikhail Gudim Date: Mon, 22 Sep 2025 15:16:36 -0700 Subject: [PATCH 3/5] fix typo --- llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp index 702eca2f2149a..d9d00c1fd7113 100644 --- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp +++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp @@ -6829,7 +6829,7 @@ bool BoUpSLP::isStridedLoad(ArrayRef VL, ArrayRef PointerOps, // Try to generate strided load node. auto IsAnyPointerUsedOutGraph = - Iany_of(PointerOps, [&](Value *V) { + any_of(PointerOps, [&](Value *V) { return isa(V) && any_of(V->users(), [&](User *U) { return !isVectorized(U) && !MustGather.contains(U); }); From 58dffe4dc1c9c3171570ef988ce3d2362135bdec Mon Sep 17 00:00:00 2001 From: Mikhail Gudim Date: Mon, 22 Sep 2025 15:27:17 -0700 Subject: [PATCH 4/5] format --- llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp index d9d00c1fd7113..1814d9a6811c0 100644 --- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp +++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp @@ -6828,12 +6828,11 @@ bool BoUpSLP::isStridedLoad(ArrayRef VL, ArrayRef PointerOps, return false; // Try to generate strided load node. - auto IsAnyPointerUsedOutGraph = - any_of(PointerOps, [&](Value *V) { - return isa(V) && any_of(V->users(), [&](User *U) { - return !isVectorized(U) && !MustGather.contains(U); - }); - }); + auto IsAnyPointerUsedOutGraph = any_of(PointerOps, [&](Value *V) { + return isa(V) && any_of(V->users(), [&](User *U) { + return !isVectorized(U) && !MustGather.contains(U); + }); + }); const uint64_t AbsoluteDiff = std::abs(Diff); Type *ScalarTy = VL.front()->getType(); From d50d82f07c885a66047fea97161c856aaf7687e1 Mon Sep 17 00:00:00 2001 From: Mikhail Gudim Date: Tue, 23 Sep 2025 09:32:08 -0700 Subject: [PATCH 5/5] trigger CI