[llvm] [SLPVectorizer][NFC] Save stride in a map. (PR #157706)
Mikhail Gudim via llvm-commits
llvm-commits at lists.llvm.org
Thu Sep 11 11:26:24 PDT 2025
================
@@ -13030,10 +13063,18 @@ void BoUpSLP::transformNodes() {
InstructionCost StridedCost = TTI->getStridedMemoryOpCost(
Instruction::Load, VecTy, BaseLI->getPointerOperand(),
/*VariableMask=*/false, CommonAlignment, CostKind, BaseLI);
- if (StridedCost < OriginalVecCost)
+ if (StridedCost < OriginalVecCost) {
// Strided load is more profitable than consecutive load + reverse -
// transform the node to strided load.
+ Type *StrideTy = DL->getIndexType(cast<LoadInst>(E.Scalars.front())
+ ->getPointerOperand()
+ ->getType());
+ StridedPtrInfo SPtrInfo;
+ SPtrInfo.StrideVal = ConstantInt::get(StrideTy, 1);
----------------
mgudim wrote:
With some hacks I was able to generate -1 stride. On RISCV the resulting assembly looks like this:
```
addi a0, a0, 15
li a2, -1
vsetivli zero, 16, e8, m1, ta, ma
vlse8.v v8, (a0), a2
vse8.v v8, (a1)
ret
```
but by default we generate this:
```
vsetivli zero, 16, e8, m1, ta, ma
vle8.v v8, (a0)
vid.v v9
vrsub.vi v9, v9, 15
vrgather.vv v10, v8, v9
vse8.v v10, (a1)
ret
```
So isn't the first version (with -1 stride) better?
https://github.com/llvm/llvm-project/pull/157706
More information about the llvm-commits
mailing list