Skip to content

[X86] improve llvm.experimental.vector.histogram codegen on avx512 #216070

Description

@Andarwinux

see #158292 (comment)

Hmm. Perhaps the default costs need to be increased to avoid it? (It's possible to use vpconflict for this, but the X86 backend isn't my area of expertise)

void simple_histogram(int *restrict buckets, unsigned *indices, int N, int inc) {
  for (int i = 0; i < N; ++i)
    buckets[indices[i]] += inc;
}

-O3 -march=znver5 -mllvm -enable-histogram-loop-vectorization

simple_histogram:
  testl %edx, %edx
  jle .LBB0_13
  movl %edx, %eax
  cmpl $8, %edx
  jae .LBB0_3
  xorl %edx, %edx
  jmp .LBB0_12
.LBB0_3:
  vpbroadcastq %rdi, %zmm0
  cmpl $16, %edx
  jae .LBB0_5
  xorl %edx, %edx
.LBB0_9:
  movq %rdx, %r8
  movl %eax, %edx
  andl $2147483640, %edx
.LBB0_10:
  vpmovzxdq (%rsi,%r8,4), %zmm1
  addq $8, %r8
  vpsllq $2, %zmm1, %zmm1
  vpaddq %zmm1, %zmm0, %zmm1
  vmovq %xmm1, %r9
  vextracti128 $1, %ymm1, %xmm2
  vpextrq $1, %xmm1, %r10
  addl %ecx, (%r9)
  addl %ecx, (%r10)
  vmovq %xmm2, %r11
  vpextrq $1, %xmm2, %r10
  vextracti32x4 $2, %zmm1, %xmm2
  vextracti32x4 $3, %zmm1, %xmm1
  addl %ecx, (%r11)
  addl %ecx, (%r10)
  vmovq %xmm2, %r11
  vpextrq $1, %xmm2, %r10
  addl %ecx, (%r11)
  addl %ecx, (%r10)
  vmovq %xmm1, %r11
  vpextrq $1, %xmm1, %r10
  addl %ecx, (%r11)
  addl %ecx, (%r10)
  cmpq %r8, %rdx
  jne .LBB0_10
  cmpl %eax, %edx
  jne .LBB0_12
  jmp .LBB0_13
.LBB0_5:
  movl $6916, %r8d
  movl %eax, %edx
  andl $2147483632, %edx
  xorl %r9d, %r9d
  bextrl %r8d, %eax, %r8d
  shlq $6, %r8
.LBB0_6:
  vpmovzxdq (%rsi,%r9), %zmm1
  vpmovzxdq 32(%rsi,%r9), %zmm2
  addq $64, %r9
  vpsllq $2, %zmm1, %zmm1
  vpsllq $2, %zmm2, %zmm2
  vpaddq %zmm1, %zmm0, %zmm1
  vpaddq %zmm2, %zmm0, %zmm2
  vmovq %xmm1, %r10
  vextracti128 $1, %ymm1, %xmm3
  addl %ecx, (%r10)
  vpextrq $1, %xmm1, %r10
  addl %ecx, (%r10)
  vmovq %xmm3, %r10
  addl %ecx, (%r10)
  vpextrq $1, %xmm3, %r10
  vextracti32x4 $2, %zmm1, %xmm3
  vextracti32x4 $3, %zmm1, %xmm1
  addl %ecx, (%r10)
  vmovq %xmm3, %r10
  addl %ecx, (%r10)
  vpextrq $1, %xmm3, %r10
  addl %ecx, (%r10)
  vmovq %xmm1, %r10
  addl %ecx, (%r10)
  vpextrq $1, %xmm1, %r10
  vextracti128 $1, %ymm2, %xmm1
  addl %ecx, (%r10)
  vmovq %xmm2, %r10
  addl %ecx, (%r10)
  vpextrq $1, %xmm2, %r10
  addl %ecx, (%r10)
  vmovq %xmm1, %r10
  addl %ecx, (%r10)
  vpextrq $1, %xmm1, %r10
  vextracti32x4 $2, %zmm2, %xmm1
  addl %ecx, (%r10)
  vmovq %xmm1, %r10
  addl %ecx, (%r10)
  vpextrq $1, %xmm1, %r10
  vextracti32x4 $3, %zmm2, %xmm1
  addl %ecx, (%r10)
  vmovq %xmm1, %r10
  vpextrq $1, %xmm1, %r11
  addl %ecx, (%r10)
  addl %ecx, (%r11)
  cmpq %r9, %r8
  jne .LBB0_6
  cmpl %eax, %edx
  je .LBB0_13
  testb $8, %al
  jne .LBB0_9
.LBB0_12:
  movl (%rsi,%rdx,4), %r8d
  incq %rdx
  addl %ecx, (%rdi,%r8,4)
  cmpq %rdx, %rax
  jne .LBB0_12
.LBB0_13:
  vzeroupper
  retq

https://godbolt.org/z/jesqYadr6

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions