Issue 207882
Summary [LV][libc++] failed to vectorize std::bitset in SPEC17 541.leela_r
Labels libc++, vectorizers, missed-optimization
Assignees
Reporter Andarwinux
    https://godbolt.org/z/evMv3qxfG

found from https://gcc.gnu.org/bugzilla/show_bug.cgi?id=121744

> 541.leela_r contains sth along the following:

```c++
#include <bitset>
#include <vector>

class Foo
{
public:
    void fun (std::bitset<21*21>& blacksq);
    std::vector<int> m_mcowner;
};

void Foo::fun(std::bitset<21*21>& blacksq)
{
  for (unsigned int i = 0; i < blacksq.size(); i++)
    if (blacksq[i])
      m_mcowner[i]++;
}
```
gcc libstdc++:
```asm
"Foo::fun(std::bitset<441ul>&)":
  mov r8, QWORD PTR [rdi]
  vmovdqa xmm3, XMMWORD PTR .LC0[rip]
  mov eax, 1
  vpcmpeqd xmm9, xmm9, xmm9
  vpbroadcastq xmm5, rax
  mov eax, 3
  vpsrld xmm8, xmm9, 26
 kmovb k2, eax
  mov eax, 4
  vpxor xmm6, xmm6, xmm6
  vpbroadcastd xmm7, eax
  lea rdi, [r8+1760]
  mov rdx, r8
.L3:
  vpmovzxdq xmm2, xmm3
 vpsrldq xmm1, xmm3, 8
  vpmovzxdq xmm1, xmm1
  vpandd xmm0, xmm3, xmm8
 vpsrlq xmm2, xmm2, 6
  vpextrq rax, xmm2, 1
  vmovq rcx, xmm2
  vpsrlq xmm1, xmm1, 6
  vmovq xmm2, QWORD PTR [rsi+rcx*8]
  vmovq rcx, xmm1
 vpinsrq xmm2, xmm2, QWORD PTR [rsi+rax*8], 1
  vpextrq rax, xmm1, 1
  vmovq xmm1, QWORD PTR [rsi+rcx*8]
  vpinsrq xmm1, xmm1, QWORD PTR [rsi+rax*8], 1
 vpmovzxdq xmm4, xmm0
  vpsrldq xmm0, xmm0, 8
  vpmovzxdq xmm0, xmm0
 vpsllvq xmm4, xmm5, xmm4
  vpsllvq xmm0, xmm5, xmm0
  vpandq xmm2, xmm2, xmm4
  vpandq xmm0, xmm1, xmm0
  vpcmpq k0, xmm2, xmm6, 4
  vpcmpq k1, xmm0, xmm6, 4
  kandb k0, k0, k2
  kshiftlb k1, k1, 2
  korb k3, k0, k1
 kmovb eax, k3
  and eax, 15
  kmovb k1, eax
  je .L2
  vmovdqu32 xmm0{k1}{z}, XMMWORD PTR [rdx]
  vpsubd xmm0, xmm0, xmm9
  vmovdqu32 XMMWORD PTR [rdx]{k1}, xmm0
.L2:
  add rdx, 16
  vpaddd xmm3, xmm3, xmm7
 cmp rdi, rdx
  jne .L3
  test BYTE PTR [rsi+55], 1
  je .L10
  inc DWORD PTR [r8+1760]
.L10:
  ret
.LC0:
  .long 0
  .long 1
  .long 2
  .long 3
```
clang libstdc++ or libc++:
```asm
Foo::fun(std::bitset<441ul>&):
 mov rax, qword ptr [rdi]
  mov ecx, 6
  jmp .LBB0_1
.LBB0_15:
  add rcx, 7
  cmp rcx, 447
  je .LBB0_16
.LBB0_1:
  lea rdx, [rcx - 6]
  mov rdi, rdx
  shr rdi, 6
  mov rdi, qword ptr [rsi + 8*rdi]
  bt rdi, rdx
  jae .LBB0_3
  inc dword ptr [rax + 4*rcx - 24]
.LBB0_3:
  lea rdx, [rcx - 5]
 mov rdi, rdx
  shr rdi, 6
  mov rdi, qword ptr [rsi + 8*rdi]
  bt rdi, rdx
  jae .LBB0_5
  inc dword ptr [rax + 4*rcx - 20]
.LBB0_5:
  lea rdx, [rcx - 4]
  mov rdi, rdx
  shr rdi, 6
  mov rdi, qword ptr [rsi + 8*rdi]
 bt rdi, rdx
  jae .LBB0_7
  inc dword ptr [rax + 4*rcx - 16]
.LBB0_7:
 lea rdx, [rcx - 3]
  mov rdi, rdx
  shr rdi, 6
  mov rdi, qword ptr [rsi + 8*rdi]
  bt rdi, rdx
  jae .LBB0_9
  inc dword ptr [rax + 4*rcx - 12]
.LBB0_9:
  lea rdx, [rcx - 2]
  mov rdi, rdx
  shr rdi, 6
  mov rdi, qword ptr [rsi + 8*rdi]
  bt rdi, rdx
  jae .LBB0_11
  inc dword ptr [rax + 4*rcx - 8]
.LBB0_11:
  lea rdx, [rcx - 1]
  mov rdi, rdx
  shr rdi, 6
 mov rdi, qword ptr [rsi + 8*rdi]
  bt rdi, rdx
  jae .LBB0_13
  inc dword ptr [rax + 4*rcx - 4]
.LBB0_13:
  mov rdx, rcx
  shr rdx, 6
  mov rdx, qword ptr [rsi + 8*rdx]
  bt rdx, rcx
  jae .LBB0_15
  inc dword ptr [rax + 4*rcx]
  jmp .LBB0_15
.LBB0_16:
  ret
```

Also reported as a libc++ issue, since vectorization (manual) is also missing with libc++.
_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to