[llvm] [SLP][REVEC] Disable strided load if the source is vector instruction. (PR #99462)
Han-Kuan Chen via llvm-commits
llvm-commits at lists.llvm.org
Thu Jul 18 02:51:07 PDT 2024
https://github.com/HanKuanChen created https://github.com/llvm/llvm-project/pull/99462
None
>From 1649c75684b3a86f7dfe4fe9e25e215c1b6ff89c Mon Sep 17 00:00:00 2001
From: Han-Kuan Chen <hankuan.chen at sifive.com>
Date: Tue, 9 Jul 2024 01:28:01 -0700
Subject: [PATCH] [SLP][REVEC] Disable strided load if the source is vector
instruction.
---
.../Transforms/Vectorize/SLPVectorizer.cpp | 19 ++++++++++++-------
1 file changed, 12 insertions(+), 7 deletions(-)
diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
index ccb6734d5618c..6788f9e7c96e3 100644
--- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
+++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
@@ -4582,8 +4582,12 @@ BoUpSLP::LoadsState BoUpSLP::canVectorizeLoads(
return LoadsState::Gather;
}
+ // If ScalarTy is a FixedVectorType (when REVEC is enabled), it is hard for
+ // being strided load.
+ bool IsSourceScalarInstruction = !isa<FixedVectorType>(VL[0]->getType());
Align CommonAlignment = computeCommonAlignment<LoadInst>(VL);
- if (!IsSorted && Sz > MinProfitableStridedLoads && TTI->isTypeLegal(VecTy) &&
+ if (IsSourceScalarInstruction && !IsSorted &&
+ Sz > MinProfitableStridedLoads && TTI->isTypeLegal(VecTy) &&
TTI->isLegalStridedLoadStore(VecTy, CommonAlignment) &&
calculateRtStride(PointerOps, ScalarTy, *DL, *SE, Order))
return LoadsState::StridedVectorize;
@@ -4617,12 +4621,13 @@ BoUpSLP::LoadsState BoUpSLP::canVectorizeLoads(
// 3. The loads are ordered, or number of unordered loads <=
// MaxProfitableUnorderedLoads, or loads are in reversed order.
// (this check is to avoid extra costs for very expensive shuffles).
- if (IsPossibleStrided && (((Sz > MinProfitableStridedLoads ||
- (static_cast<unsigned>(std::abs(*Diff)) <=
- MaxProfitableLoadStride * Sz &&
- isPowerOf2_32(std::abs(*Diff)))) &&
- static_cast<unsigned>(std::abs(*Diff)) > Sz) ||
- *Diff == -(static_cast<int>(Sz) - 1))) {
+ if (IsSourceScalarInstruction && IsPossibleStrided &&
+ (((Sz > MinProfitableStridedLoads ||
+ (static_cast<unsigned>(std::abs(*Diff)) <=
+ MaxProfitableLoadStride * Sz &&
+ isPowerOf2_32(std::abs(*Diff)))) &&
+ static_cast<unsigned>(std::abs(*Diff)) > Sz) ||
+ *Diff == -(static_cast<int>(Sz) - 1))) {
int Stride = *Diff / static_cast<int>(Sz - 1);
if (*Diff == Stride * static_cast<int>(Sz - 1)) {
Align Alignment =
More information about the llvm-commits
mailing list