[llvm] [SLP]Vectorize unique scalars of splat gather nodes as separate subtrees (PR #218250)

Alexey Bataev via llvm-commits llvm-commits at lists.llvm.org
Sat Aug 29 05:55:02 PDT 2026


alexey-bataev wrote:

> I am still concerned about the behavior for the case where some of the gathers (but not all) get trimmed: `opt -passes=slp-vectorizer -S -mtriple=riscv64 --mattr=+v,+zvl256b -slp-threshold=-2`
> 
> ```
> define void @splat_trim(ptr %A, ptr %B, ptr %C, ptr %D, ptr %E, ptr %F, ptr %S) {
> entry:
>   %A0 = load i64, ptr %A, align 8
>   %B0 = load i64, ptr %B, align 8
>   %C0 = load i64, ptr %C, align 8
>   %D0 = load i64, ptr %D, align 8
>   %E0 = load i64, ptr %E, align 8
>   %F0 = load i64, ptr %F, align 8
> 
>   %v1 = add i64 1, %A0
>   %v2 = add i64 1, %B0
>   %v3 = add i64 1, %E0
> 
>   %AS0 = add i64 %v1, %v2
>   %AS1 = add i64 %v1, %v2
>   %AS2 = add i64 %v1, %v2
>   %AS3 = sub i64 %v1, %v2
> 
>   %Sh0 = shl i64 %AS0, %C0
>   %Sh1 = lshr i64 %AS1, %D0
>   %Sh2 = lshr i64 %AS2, %E0
>   %Sh3 = shl i64 %AS3, %F0
> 
>   %AS10 = add i64 %Sh0, %C0
>   %AS11 = add i64 %Sh1, %D0
>   %AS12 = add i64 %Sh3, %F0
>   %AS13 = sub i64 %Sh2, %E0
> 
>   %AS20 = add i64 %AS10, 1
>   %AS21 = add i64 %AS11, 1
>   %AS22 = add i64 %AS12, 1
>   %AS23 = add i64 %AS13, 1
> 
>   %Add0 = add i64 %AS20, %v3
>   %Add1 = add i64 %AS21, %v3
>   %Add2 = add i64 %AS22, %v3
>   %Add3 = add i64 %AS23, %v3
> 
>   %idxS1 = getelementptr inbounds i64, ptr %S, i64 1
>   %idxS2 = getelementptr inbounds i64, ptr %S, i64 2
>   %idxS3 = getelementptr inbounds i64, ptr %S, i64 3
> 
>   store i64 %Add0, ptr %S, align 8
>   store i64 %Add1, ptr %idxS1, align 8
>   store i64 %Add2, ptr %idxS2, align 8
>   store i64 %Add3, ptr %idxS3, align 8
>   ret void
> }
> ```
> 
> outputs:
> 
> ```
> define void @splat_trim(ptr %A, ptr %B, ptr %C, ptr %D, ptr %E, ptr %F, ptr %S) #0 {
> entry:
>   %A0 = load i64, ptr %A, align 8
>   %B0 = load i64, ptr %B, align 8
>   %C0 = load i64, ptr %C, align 8
>   %D0 = load i64, ptr %D, align 8
>   %E0 = load i64, ptr %E, align 8
>   %F0 = load i64, ptr %F, align 8
>   %0 = insertelement <3 x i64> poison, i64 %A0, i64 0
>   %1 = insertelement <3 x i64> %0, i64 %B0, i64 1
>   %2 = insertelement <3 x i64> %1, i64 %E0, i64 2
>   %3 = add <3 x i64> splat (i64 1), %2
>   %v2 = add i64 1, %B0
>   %4 = extractelement <3 x i64> %3, i64 0
>   %AS2 = add i64 %4, %v2
>   %AS3 = sub i64 %4, %v2
>   %AS1 = add i64 %4, %v2
>   %AS0 = add i64 %4, %v2
>   %Sh2 = lshr i64 %AS2, %E0
>   %Sh3 = shl i64 %AS3, %F0
>   %Sh1 = lshr i64 %AS1, %D0
>   %Sh0 = shl i64 %AS0, %C0
>   %AS13 = sub i64 %Sh2, %E0
>   %AS12 = add i64 %Sh3, %F0
>   %AS11 = add i64 %Sh1, %D0
>   %AS10 = add i64 %Sh0, %C0
>   %5 = insertelement <4 x i64> poison, i64 %AS10, i64 0
>   %6 = insertelement <4 x i64> %5, i64 %AS11, i64 1
>   %7 = insertelement <4 x i64> %6, i64 %AS12, i64 2
>   %8 = insertelement <4 x i64> %7, i64 %AS13, i64 3
>   %9 = add <4 x i64> %8, splat (i64 1)
>   %10 = shufflevector <3 x i64> %3, <3 x i64> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
>   %11 = add <4 x i64> %9, %10
>   store <4 x i64> %11, ptr %S, align 8
>   ret void
> }
> ```

Fixed

https://github.com/llvm/llvm-project/pull/218250


More information about the llvm-commits mailing list