llvm / llvm/llvm-project

[LV] __builtin_prefetch prevented vectorization

Open
#200,655 4 comments 0 reactions 0 assignees View on GitHub
backend:AArch64 backend:X86 vectorizers
Dominant language
LLVM
Stars
40.5k
Forks
18.7k
PR merge metrics
PR metrics pending

Description

see https://developer.arm.com/community/arm-community-blogs/b/tools-software-ides-blog/posts/gcc-15-continuously-improving

https://godbolt.org/z/Pvoezdv1f

```c
void
foo (double *restrict a, double *restrict b, int n)
{
int i;
for (i = 0; i < n; ++i)
{
a[i] = a[i] + b[i];
__builtin_prefetch (&(b[i + 8]));
}
}
```
gcc aarch64
```asm
foo:
cmp w2, 0
ble .L1
sub w3, w2, #1
cmp w3, 2
bls .L5
lsr w5, w2, 2
mov w3, 0
lsr w7, w2, 2
lsl x5, x5, 5
add x4, x0, 16
add x6, x1, 16
.L4:
ldr q29, [x0, x3]
ldr q31, [x1, x3]
ldr q30, [x4, x3]
ldr q0, [x6, x3]
fadd v31.2d, v29.2d, v31.2d
fadd v30.2d, v0.2d, v30.2d
str q31, [x0, x3]
str q30, [x4, x3]
add x3, x3, 32
cmp x3, x5
bne .L4
lsl w3, w7, 2
cmp w2, w3
beq .L1
.L3:
uxtw x4, w3
sub w2, w2, w3
whilelo p7.d, wzr, w2
ld1d z28.d, p7/z, [x0, x4, lsl 3]
ld1d z27.d, p7/z, [x1, x4, lsl 3]
fadd z28.d, p7/m, z28.d, z27.d
add x0, x0, x4, lsl 3
st1d z28.d, p7, [x0]
mov w3, 2
whilelo p7.d, w3, w2
add x4, x1, x4, lsl 3
b.any .L8
.L1:
ret
.L8:
ld1d z26.d, p7/z, [x0, #1, mul vl]
ld1d z25.d, p7/z, [x4, #1, mul vl]
fadd z26.d, p7/m, z26.d, z25.d
st1d z26.d, p7, [x0, #1, mul vl]
ret
.L5:
mov w3, 0
b .L3
```
clang aarch64
```asm
foo:
cmp w2, #1
b.lt .LBB0_8
cmp w2, #1
b.ne .LBB0_3
mov x8, xzr
b .LBB0_7
.LBB0_3:
mov w9, w2
mov x8, xzr
add x11, x0, #8
add x12, x1, #64
and x10, x9, #0x7ffffffe
neg x10, x10
.LBB0_4:
ldp d4, d0, [x11, #-8]
ldp d2, d1, [x12, #-64]
prfm pldl1keep, [x12]
sub x8, x8, #2
cmp x10, x8
fadd d3, d4, d2
fadd d0, d0, d1
stp d3, d0, [x11, #-8]
prfm pldl1keep, [x12, #8]
add x11, x11, #16
add x12, x12, #16
b.ne .LBB0_4
tbz w9, #0, .LBB0_8
neg x8, x8
.LBB0_7:
add x9, x1, x8, lsl #3
ldr d0, [x0, x8, lsl #3]
ldr d1, [x9], #64
fadd d0, d0, d1
str d0, [x0, x8, lsl #3]
prfm pldl1keep, [x9]
.LBB0_8:
ret
```
gcc x86
```asm
"foo":
mov rcx, rsi
test edx, edx
jle .L12
lea eax, [rdx-1]
cmp eax, 2
jbe .L6
mov r8d, edx
xor eax, eax
shr r8d, 2
mov esi, r8d
sal rsi, 5
.L4:
vmovupd ymm0, YMMWORD PTR [rcx+rax]
vaddpd ymm0, ymm0, YMMWORD PTR [rdi+rax]
vmovupd YMMWORD PTR [rdi+rax], ymm0
add rax, 32
cmp rax, rsi
jne .L4
lea eax, [0+r8*4]
cmp edx, eax
je .L11
mov esi, eax
vzeroupper
.L3:
sub edx, eax
cmp edx, 1
je .L5
vmovupd xmm0, XMMWORD PTR [rdi+rax*8]
vaddpd xmm0, xmm0, XMMWORD PTR [rcx+rax*8]
vmovupd XMMWORD PTR [rdi+rax*8], xmm0
mov eax, edx
and eax, -2
and edx, 1
je .L12
add esi, eax
.L5:
lea rax, [0+rsi*8]
vmovsd xmm0, QWORD PTR [rdi+rax]
prefetcht0 [rcx+64+rax]
vaddsd xmm0, xmm0, QWORD PTR [rcx+rsi*8]
vmovsd QWORD PTR [rdi+rax], xmm0
ret
.L11:
vzeroupper
.L12:
ret
.L6:
xor eax, eax
xor esi, esi
jmp .L3
```
clang x86
```asm
foo:
test edx, edx
jle .LBB0_8
mov ecx, edx
mov eax, ecx
and eax, 3
cmp edx, 4
jae .LBB0_3
xor edx, edx
jmp .LBB0_6
.LBB0_3:
and ecx, 2147483644
lea r8, [rsi + 88]
xor edx, edx
.LBB0_4:
vmovsd xmm0, qword ptr [rdi + 8*rdx]
vaddsd xmm0, xmm0, qword ptr [r8 + 8*rdx - 88]
vmovsd qword ptr [rdi + 8*rdx], xmm0
vmovsd xmm0, qword ptr [rdi + 8*rdx + 8]
vaddsd xmm0, xmm0, qword ptr [r8 + 8*rdx - 80]
vmovsd qword ptr [rdi + 8*rdx + 8], xmm0
prefetcht0 byte ptr [r8 + 8*rdx - 24]
prefetcht0 byte ptr [r8 + 8*rdx - 16]
vmovsd xmm0, qword ptr [rdi + 8*rdx + 16]
vaddsd xmm0, xmm0, qword ptr [r8 + 8*rdx - 72]
vmovsd qword ptr [rdi + 8*rdx + 16], xmm0
vmovsd xmm0, qword ptr [rdi + 8*rdx + 24]
vaddsd xmm0, xmm0, qword ptr [r8 + 8*rdx - 64]
prefetcht0 byte ptr [r8 + 8*rdx - 8]
vmovsd qword ptr [rdi + 8*rdx + 24], xmm0
prefetcht0 byte ptr [r8 + 8*rdx]
add rdx, 4
cmp rcx, rdx
jne .LBB0_4
test rax, rax
je .LBB0_8
.LBB0_6:
lea rcx, [rsi + 8*rdx + 64]
lea rdx, [rdi + 8*rdx]
xor esi, esi
.LBB0_7:
vmovsd xmm0, qword ptr [rdx + 8*rsi]
vaddsd xmm0, xmm0, qword ptr [rcx + 8*rsi - 64]
vmovsd qword ptr [rdx + 8*rsi], xmm0
prefetcht0 byte ptr [rcx + 8*rsi]
inc rsi
cmp rax, rsi
jne .LBB0_7
.LBB0_8:
ret
```

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.