[llvm] [X86] Lower vector integer division and remainder through float division (PR #205263)

via llvm-commits llvm-commits at lists.llvm.org
Sun Jul 19 02:27:03 PDT 2026


================
@@ -1193,42 +882,283 @@ define <3 x i10> @urem_v3i10(<3 x i10> %x, <3 x i10> %y, <3 x i1> %m) {
 ; AVX512-NEXT:    vpinsrd $1, %esi, %xmm0, %xmm0
 ; AVX512-NEXT:    vpinsrd $2, %edx, %xmm0, %xmm0
 ; AVX512-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [1023,1023,1023,1023]
-; AVX512-NEXT:    movb $7, %al
-; AVX512-NEXT:    kmovd %eax, %k1
-; AVX512-NEXT:    vmovd {{.*#+}} xmm2 = mem[0],zero,zero,zero
-; AVX512-NEXT:    vpinsrb $1, {{[0-9]+}}(%rsp), %xmm2, %xmm2
-; AVX512-NEXT:    vpinsrb $2, {{[0-9]+}}(%rsp), %xmm2, %xmm2
-; AVX512-NEXT:    vpmovzxbd {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero,xmm2[2],zero,zero,zero,xmm2[3],zero,zero,zero
-; AVX512-NEXT:    vpbroadcastd {{.*#+}} xmm3 = [1,1,1,1]
-; AVX512-NEXT:    vmovd %ecx, %xmm4
-; AVX512-NEXT:    vpinsrd $1, %r8d, %xmm4, %xmm4
-; AVX512-NEXT:    vptestmd %xmm3, %xmm2, %k1 {%k1}
-; AVX512-NEXT:    vpinsrd $2, %r9d, %xmm4, %xmm2
-; AVX512-NEXT:    vpandd %xmm1, %xmm2, %xmm3 {%k1}
-; AVX512-NEXT:    vpextrd $1, %xmm3, %ecx
+; AVX512-NEXT:    vmovd %ecx, %xmm2
+; AVX512-NEXT:    vpinsrd $1, %r8d, %xmm2, %xmm2
+; AVX512-NEXT:    vpinsrd $2, %r9d, %xmm2, %xmm2
 ; AVX512-NEXT:    vpand %xmm1, %xmm0, %xmm0
-; AVX512-NEXT:    vpextrd $1, %xmm0, %eax
-; AVX512-NEXT:    xorl %edx, %edx
-; AVX512-NEXT:    divl %ecx
-; AVX512-NEXT:    movl %edx, %ecx
-; AVX512-NEXT:    vmovd %xmm3, %esi
+; AVX512-NEXT:    vpand %xmm1, %xmm2, %xmm1
+; AVX512-NEXT:    vcvtdq2pd %xmm1, %ymm2
+; AVX512-NEXT:    vcvtdq2pd %xmm0, %ymm3
+; AVX512-NEXT:    vdivpd %ymm2, %ymm3, %ymm2
----------------
Andarwinux wrote:

This will also fix https://github.com/llvm/llvm-project/pull/205263#issuecomment-4896817399

It's best to add test coverage for this:

```llvm
define void @test(ptr %0, ptr %1, ptr %2) nounwind {
  %4 = load <16 x i16>, ptr %1
  %5 = sext <16 x i16> %4 to <16 x i32>
  %6 = load <16 x i16>, ptr %2
  %7 = sext <16 x i16> %6 to <16 x i32>
  %8 = sdiv <16 x i32> %5, %7
  %9 = trunc <16 x i32> %8 to <16 x i16>
  store <16 x i16> %9, ptr %0
  ret void
}
```
from
```asm
        vpmovsxwd       (%rsi), %zmm0
        vpmovsxwd       (%rdx), %zmm1
        vcvtdq2pd       %ymm1, %zmm2
        vcvtdq2pd       %ymm0, %zmm3
        vdivpd  %zmm2, %zmm3, %zmm2
        vcvttpd2dq      %zmm2, %ymm2
        vextracti64x4   $1, %zmm1, %ymm1
        vcvtdq2pd       %ymm1, %zmm1
        vextracti64x4   $1, %zmm0, %ymm0
        vcvtdq2pd       %ymm0, %zmm0
        vdivpd  %zmm1, %zmm0, %zmm0
        vcvttpd2dq      %zmm0, %ymm0
        vinserti64x4    $1, %ymm0, %zmm2, %zmm0
        vpmovdw %zmm0, (%rdi)
        vzeroupper
        retq
```
to
```asm
        vpmovsxwd       (%rsi), %zmm0
        vpmovsxwd       (%rdx), %zmm1
        vcvtdq2ps       %zmm1, %zmm1
        vcvtdq2ps       %zmm0, %zmm0
        vdivps  %zmm1, %zmm0, %zmm0
        vcvttps2dq      %zmm0, %zmm0
        vpmovdw %zmm0, (%rdi)
        vzeroupper
        retq
```

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


More information about the llvm-commits mailing list