| Issue |
207889
|
| Summary |
[X86][[LV] suboptimal byte dot-product vectorization
|
| Labels |
backend:X86,
vectorizers
|
| Assignees |
|
| Reporter |
Andarwinux
|
found from https://github.com/gcc-mirror/gcc/commit/5be7b70e769e6e992dbf631cd37e24bd9da9e05e
https://godbolt.org/z/vqGT58Mv4
```c++
char *fn_c, *fn_d;
int fn() {
int res = 0;
for (int i = 0; i < 64; ++i)
res += fn_c[i] * fn_d[i];
return res;
}
```
gcc:
```asm
"fn()":
mov rax, QWORD PTR "fn_c"[rip]
vpxor xmm3, xmm3, xmm3
vmovdqu8 zmm0, ZMMWORD PTR [rax]
mov rax, QWORD PTR "fn_d"[rip]
vmovdqu8 zmm1, ZMMWORD PTR [rax]
vpmovsxbw zmm4, ymm0
vextracti64x4 ymm0, zmm0, 0x1
vpmovsxbw zmm0, ymm0
vpmovsxbw zmm5, ymm1
vextracti64x4 ymm1, zmm1, 0x1
vpmovsxbw zmm2, ymm1
vmovdqa32 zmm1, zmm3
vpdpwssd zmm3, zmm0, zmm2
vpdpwssd zmm1, zmm4, zmm5
vpaddd zmm1, zmm1, zmm3
vextracti32x8 ymm0, zmm1, 0x1
vpaddd ymm0, ymm0, ymm1
vextracti32x4 xmm1, ymm0, 0x1
vpaddd xmm0, xmm1, xmm0
vpshufd xmm1, xmm0, 238
vpaddd xmm1, xmm1, xmm0
vpshufd xmm0, xmm1, 85
vpaddd xmm0, xmm0, xmm1
vmovd eax, xmm0
vzeroupper
ret
"fn_d":
.zero 8
"fn_c":
.zero 8
```
clang:
```asm
fn():
mov rax, qword ptr [rip + fn_c]
mov rcx, qword ptr [rip + fn_d]
vpmovsxbw ymm4, xmmword ptr [rcx + 16]
vpmovsxbw ymm5, xmmword ptr [rax + 16]
vpmovsxbw ymm7, xmmword ptr [rcx]
vpmovsxbw ymm6, xmmword ptr [rax]
vpmovsxbw ymm2, xmmword ptr [rcx + 32]
vpmovsxbw ymm3, xmmword ptr [rax + 32]
vpmovsxbw ymm0, xmmword ptr [rcx + 48]
vpmovsxbw ymm1, xmmword ptr [rax + 48]
vpmaddwd ymm4, ymm4, ymm5
{vex} vpdpwssd ymm4, ymm7, ymm6
{vex} vpdpwssd ymm4, ymm2, ymm3
{vex} vpdpwssd ymm4, ymm0, ymm1
vextracti128 xmm0, ymm4, 1
vpaddd xmm0, xmm4, xmm0
vpshufd xmm1, xmm0, 238
vpaddd xmm0, xmm0, xmm1
vpshufd xmm1, xmm0, 85
vpaddd xmm0, xmm0, xmm1
vmovd eax, xmm0
vzeroupper
ret
fn_c:
.quad 0
fn_d:
.quad 0
```
clang generated more memory loads and failed to emit zmm vpdpwssd.
_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs