[llvm] [X86] Replace custom AND/OR/XOR reduction pattern matching with ISD::VECREDUCE_AND/OR/XOR support (PR #199544)

via llvm-commits llvm-commits at lists.llvm.org
Wed Aug 5 02:43:11 PDT 2026


================
@@ -244,26 +219,26 @@ define i32 @extract_last_active_v4i32_penryn(<4 x i32> %a, <4 x i1> %c) "target-
 define i8 @extract_last_active_split(<32 x i8> %data, <32 x i8> %mask, i8 %passthru) {
----------------
Andarwinux wrote:

vector-extract-last-active.ll might need some avx512 codegen coverage:

before this PR:
```asm
<extract_last_active_split>:
                pushp   %rbp
                movq    %rsp, %rbp
                andq    $-0x20, %rsp
                subq    $0x40, %rsp
                vptestmb        %ymm1, %ymm1, %k1
                vmovaps %ymm0, (%rsp)
                kshiftrd        $0x10, %k1, %k0
                korw    %k0, %k1, %k0
                kshiftrw        $0x8, %k0, %k2
                korb    %k2, %k0, %k0
                kshiftrb        $0x4, %k0, %k2
                korw    %k2, %k0, %k0
                kshiftrb        $0x2, %k0, %k2
                korw    %k2, %k0, %k0
                kshiftrb        $0x1, %k0, %k2
                korw    %k2, %k0, %k0
                kmovd   %k0, %eax
                vmovdqu8        (%rip), %ymm0 {%k1} {z} # 0x359 <extract_last_active_split+0x59>
                vextracti128    $0x1, %ymm0, %xmm1
                vpmaxub %xmm1, %xmm0, %xmm0
                vpternlogq      $0xf, %xmm0, %xmm0, %xmm0 # xmm0 = ~xmm0
                vpsrlw  $0x8, %xmm0, %xmm1
                vpminub %xmm1, %xmm0, %xmm0
                vphminposuw     %xmm0, %xmm0
                vmovd   %xmm0, %ecx
                notb    %cl
                movzbl  %cl, %ecx
                andl    $0x1f, %ecx
                movzbl  (%rsp,%rcx), %ecx
                testb   $0x1, %al
                cmovnel %ecx, %edi, %eax
                movq    %rbp, %rsp
                popp    %rbp
                vzeroupper
                retq
```
after this PR:
```asm
<extract_last_active_split>:
                pushp   %rbp
                movq    %rsp, %rbp
                andq    $-0x20, %rsp
                subq    $0x40, %rsp
                vptestmb        %ymm1, %ymm1, %k1
                vmovaps %ymm0, (%rsp)
                vmovdqu8        (%rip), %ymm0 {%k1} {z} # 0x2a3 <extract_last_active_split+0x23>
                vextracti128    $0x1, %ymm0, %xmm2
                vpmaxub %xmm2, %xmm0, %xmm0
                vpternlogq      $0xf, %xmm0, %xmm0, %xmm0 # xmm0 = ~xmm0
                vpsrlw  $0x8, %xmm0, %xmm2
                vpminub %xmm2, %xmm0, %xmm0
                vphminposuw     %xmm0, %xmm0
                vmovd   %xmm0, %eax
                notb    %al
                movzbl  %al, %eax
                andl    $0x1f, %eax
                movzbl  (%rsp,%rax), %eax
                vptest  %ymm1, %ymm1
                cmovel  %edi, %eax
                movq    %rbp, %rsp
                popp    %rbp
                vzeroupper
                retq
```

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


More information about the llvm-commits mailing list