Skip to content

[LICM] bloated code with -extra-vectorizer-passes #203904

@Andarwinux

Description

@Andarwinux

https://godbolt.org/z/reK8jsrbh

#include <stddef.h>
#include <stdint.h>
#define ASSUME(x) if (!(x)) __builtin_unreachable()
void ass_shift_bitmap_c(uint8_t *restrict buf, ptrdiff_t stride,
                        size_t width, size_t height,
                        uint32_t shift_x, uint32_t shift_y, uint16_t *restrict tmp) 
{
    ASSUME(shift_x < 64 && shift_y < 64 && !(stride % 16) && width > 0 && height > 0 && stride > 0);

    for (size_t y = 0; y < height; y++) {
        uint16_t shifted_from_left = 0;
        for (size_t x = 0; x < width; x++) {
            uint16_t px = buf[x] << 1;
            uint16_t shifted_from_top = tmp[x];

            uint16_t b_x = px * shift_x >> 6;

            px += shifted_from_left;
            px -= b_x;

            uint16_t b_y = px * shift_y >> 6;

            px += shifted_from_top;
            px -= b_y;

            buf[x] = (px + 1) >> 1;

            shifted_from_left = b_x;
            tmp[x] = b_y;
        }

        buf += stride;
    }
}

-mllvm -extra-vectorizer-passes=false

.LCPI0_0:
        .short  65535
        .short  0
ass_shift_bitmap_c:
        push    rbp
        push    r15
        push    r14
        push    rbx
        vpbroadcastd    zmm2, dword ptr [rip + .LCPI0_0]
        mov     rax, qword ptr [rsp + 40]
        mov     r10, rdx
        and     r10, -32
        vpbroadcastd    zmm0, r8d
        vpbroadcastd    zmm1, r9d
        vpternlogd      zmm3, zmm3, zmm3, 255
        xor     r11d, r11d
        jmp     .LBB0_1
.LBB0_4:
        add     rdi, rsi
        inc     r11
        cmp     r11, rcx
        je      .LBB0_5
.LBB0_1:
        cmp     rdx, 32
        jae     .LBB0_6
        xor     r14d, r14d
        xor     ebx, ebx
        jmp     .LBB0_3
.LBB0_6:
        vpxor   xmm4, xmm4, xmm4
        xor     ebx, ebx
.LBB0_7:
        vpmovzxbd       zmm5, xmmword ptr [rdi + rbx]
        vpmovzxbd       zmm6, xmmword ptr [rdi + rbx + 16]
        vpaddd  zmm5, zmm5, zmm5
        vpaddd  zmm6, zmm6, zmm6
        vpmulld zmm7, zmm5, zmm0
        vpmulld zmm8, zmm6, zmm0
        vpsrld  zmm7, zmm7, 6
        valignd zmm9, zmm7, zmm4, 15
        vpsrld  zmm4, zmm8, 6
        valignd zmm8, zmm4, zmm7, 15
        vpaddd  zmm5, zmm5, zmm9
        vpaddd  zmm6, zmm6, zmm8
        vpsubd  zmm5, zmm5, zmm7
        vpsubd  zmm6, zmm6, zmm4
        vpandq  zmm8, zmm5, zmm2
        vpmovdw ymm5, zmm5
        vpandq  zmm7, zmm6, zmm2
        vpmovdw ymm6, zmm6
        vpmulld zmm8, zmm8, zmm1
        vpmulld zmm7, zmm7, zmm1
        vpsrld  zmm8, zmm8, 6
        vpsrld  zmm7, zmm7, 6
        vpmovdw ymm8, zmm8
        vinserti64x4    zmm5, zmm5, ymm6, 1
        vpaddw  zmm5, zmm5, zmmword ptr [rax + 2*rbx]
        vpmovdw ymm7, zmm7
        vinserti64x4    zmm7, zmm8, ymm7, 1
        vmovdqu64       zmmword ptr [rax + 2*rbx], zmm7
        vpsubw  zmm5, zmm5, zmm7
        vpsubw  zmm5, zmm5, zmm3
        vpsrlw  zmm5, zmm5, 1
        vpmovwb ymmword ptr [rdi + rbx], zmm5
        add     rbx, 32
        cmp     r10, rbx
        jne     .LBB0_7
        cmp     rdx, r10
        je      .LBB0_4
        vextracti32x4   xmm4, zmm4, 3
        mov     rbx, r10
        vpextrd r14d, xmm4, 3
.LBB0_3:
        movzx   r15d, byte ptr [rdi + rbx]
        lea     ebp, [r14 + 2*r15]
        lea     r14d, [r15 + r15]
        imul    r14d, r8d
        shr     r14d, 6
        sub     ebp, r14d
        movzx   ebp, bp
        mov     r15d, ebp
        add     bp, word ptr [rax + 2*rbx]
        imul    r15d, r9d
        shr     r15d, 6
        mov     word ptr [rax + 2*rbx], r15w
        sub     ebp, r15d
        inc     ebp
        shr     ebp
        mov     byte ptr [rdi + rbx], bpl
        inc     rbx
        cmp     rdx, rbx
        jne     .LBB0_3
        jmp     .LBB0_4
.LBB0_5:
        pop     rbx
        pop     r14
        pop     r15
        pop     rbp
        vzeroupper
        ret

-mllvm -extra-vectorizer-passes

.LCPI0_0:
        .short  65535
        .short  0
ass_shift_bitmap_c:
        push    rbp
        push    r15
        push    r14
        push    r13
        push    r12
        push    rbx
        mov     rax, qword ptr [rsp + 56]
        cmp     rdx, 31
        ja      .LBB0_17
        mov     r14d, ecx
        and     r14d, 3
        cmp     rcx, 4
        jb      .LBB0_13
        lea     r15, [rsi + 2*rsi]
        mov     qword ptr [rsp - 8], r14
        lea     r14, [rdi + 2*rsi]
        and     rcx, -4
        lea     r11, [rdi + rsi]
        xor     r12d, r12d
        add     r15, rdi
.LBB0_3:
        xor     ebp, ebp
        xor     r13d, r13d
.LBB0_4:
        movzx   r10d, byte ptr [rdi + r13]
        lea     ebp, [rbp + 2*r10]
        add     r10d, r10d
        imul    r10d, r8d
        shr     r10d, 6
        sub     ebp, r10d
        movzx   ebp, bp
        mov     ebx, ebp
        add     bp, word ptr [rax + 2*r13]
        imul    ebx, r9d
        shr     ebx, 6
        mov     word ptr [rax + 2*r13], bx
        sub     ebp, ebx
        inc     ebp
        shr     ebp
        mov     byte ptr [rdi + r13], bpl
        inc     r13
        mov     ebp, r10d
        cmp     rdx, r13
        jne     .LBB0_4
        add     rdi, rsi
        xor     ebp, ebp
        xor     r13d, r13d
.LBB0_6:
        movzx   r10d, byte ptr [r11 + r13]
        lea     ebx, [rbp + 2*r10]
        add     r10d, r10d
        imul    r10d, r8d
        shr     r10d, 6
        sub     ebx, r10d
        movzx   ebx, bx
        mov     ebp, ebx
        add     bx, word ptr [rax + 2*r13]
        imul    ebp, r9d
        shr     ebp, 6
        mov     word ptr [rax + 2*r13], bp
        sub     ebx, ebp
        mov     ebp, r10d
        inc     ebx
        shr     ebx
        mov     byte ptr [r11 + r13], bl
        inc     r13
        cmp     rdx, r13
        jne     .LBB0_6
        add     rdi, rsi
        xor     ebp, ebp
        xor     r13d, r13d
.LBB0_8:
        movzx   r10d, byte ptr [r14 + r13]
        lea     ebx, [rbp + 2*r10]
        add     r10d, r10d
        imul    r10d, r8d
        shr     r10d, 6
        sub     ebx, r10d
        movzx   ebx, bx
        mov     ebp, ebx
        add     bx, word ptr [rax + 2*r13]
        imul    ebp, r9d
        shr     ebp, 6
        mov     word ptr [rax + 2*r13], bp
        sub     ebx, ebp
        mov     ebp, r10d
        inc     ebx
        shr     ebx
        mov     byte ptr [r14 + r13], bl
        inc     r13
        cmp     rdx, r13
        jne     .LBB0_8
        add     rdi, rsi
        xor     ebp, ebp
        xor     r13d, r13d
.LBB0_10:
        movzx   r10d, byte ptr [r15 + r13]
        lea     ebx, [rbp + 2*r10]
        add     r10d, r10d
        imul    r10d, r8d
        shr     r10d, 6
        sub     ebx, r10d
        movzx   ebx, bx
        mov     ebp, ebx
        add     bx, word ptr [rax + 2*r13]
        imul    ebp, r9d
        shr     ebp, 6
        mov     word ptr [rax + 2*r13], bp
        sub     ebx, ebp
        mov     ebp, r10d
        inc     ebx
        shr     ebx
        mov     byte ptr [r15 + r13], bl
        inc     r13
        cmp     rdx, r13
        jne     .LBB0_10
        lea     r10, [4*rsi]
        add     rdi, rsi
        add     r12, 4
        add     r11, r10
        add     r14, r10
        add     r15, r10
        cmp     r12, rcx
        jne     .LBB0_3
        mov     r14, qword ptr [rsp - 8]
        test    r14, r14
        je      .LBB0_34
.LBB0_13:
        xor     ecx, ecx
.LBB0_14:
        xor     ebx, ebx
        xor     r11d, r11d
.LBB0_15:
        movzx   r10d, byte ptr [rdi + r11]
        lea     ebx, [rbx + 2*r10]
        add     r10d, r10d
        imul    r10d, r8d
        shr     r10d, 6
        sub     ebx, r10d
        movzx   ebx, bx
        mov     ebp, ebx
        add     bx, word ptr [rax + 2*r11]
        imul    ebp, r9d
        shr     ebp, 6
        mov     word ptr [rax + 2*r11], bp
        sub     ebx, ebp
        inc     ebx
        shr     ebx
        mov     byte ptr [rdi + r11], bl
        inc     r11
        mov     ebx, r10d
        cmp     rdx, r11
        jne     .LBB0_15
        add     rdi, rsi
        inc     rcx
        cmp     rcx, r14
        jne     .LBB0_14
        jmp     .LBB0_34
.LBB0_17:
        mov     r10, rdx
        and     r10, -32
        vpbroadcastd    zmm0, r8d
        vpbroadcastd    zmm1, r9d
        cmp     rdx, r10
        jne     .LBB0_18
        cmp     rcx, 1
        je      .LBB0_32
        vpbroadcastd    zmm2, dword ptr [rip + .LCPI0_0]
        mov     rdx, rcx
        and     rdx, -2
        lea     r8, [rdi + rsi]
        lea     r9, [rsi + rsi]
        vpternlogd      zmm3, zmm3, zmm3, 255
        xor     r11d, r11d
.LBB0_26:
        vpxor   xmm4, xmm4, xmm4
        xor     ebx, ebx
.LBB0_27:
        vpmovzxbd       zmm5, xmmword ptr [rdi + rbx]
        vpmovzxbd       zmm6, xmmword ptr [rdi + rbx + 16]
        vpaddd  zmm6, zmm6, zmm6
        vpaddd  zmm5, zmm5, zmm5
        vpmulld zmm7, zmm5, zmm0
        vpmulld zmm8, zmm6, zmm0
        vpsrld  zmm7, zmm7, 6
        vpsrld  zmm8, zmm8, 6
        valignd zmm4, zmm7, zmm4, 15
        valignd zmm9, zmm8, zmm7, 15
        vpaddd  zmm4, zmm5, zmm4
        vpaddd  zmm6, zmm6, zmm9
        vpsubd  zmm4, zmm4, zmm7
        vpsubd  zmm5, zmm6, zmm8
        vpandq  zmm6, zmm5, zmm2
        vpandq  zmm7, zmm4, zmm2
        vpmovdw ymm4, zmm4
        vpmovdw ymm5, zmm5
        vpmulld zmm7, zmm7, zmm1
        vpmulld zmm6, zmm6, zmm1
        vpsrld  zmm6, zmm6, 6
        vpsrld  zmm7, zmm7, 6
        vinserti64x4    zmm4, zmm4, ymm5, 1
        vpaddw  zmm4, zmm4, zmmword ptr [rax + 2*rbx]
        vpmovdw ymm7, zmm7
        vpmovdw ymm6, zmm6
        vinserti64x4    zmm6, zmm7, ymm6, 1
        vmovdqu64       zmmword ptr [rax + 2*rbx], zmm6
        vpsubw  zmm4, zmm4, zmm6
        vpsubw  zmm4, zmm4, zmm3
        vpsrlw  zmm4, zmm4, 1
        vpmovwb ymmword ptr [rdi + rbx], zmm4
        add     rbx, 32
        vmovdqa64       zmm4, zmm8
        cmp     r10, rbx
        jne     .LBB0_27
        add     rdi, rsi
        vpxor   xmm4, xmm4, xmm4
        xor     ebx, ebx
.LBB0_29:
        vpmovzxbd       zmm5, xmmword ptr [r8 + rbx]
        vpmovzxbd       zmm6, xmmword ptr [r8 + rbx + 16]
        vpaddd  zmm6, zmm6, zmm6
        vpaddd  zmm5, zmm5, zmm5
        vpmulld zmm7, zmm5, zmm0
        vpmulld zmm8, zmm6, zmm0
        vpsrld  zmm7, zmm7, 6
        vpsrld  zmm8, zmm8, 6
        valignd zmm4, zmm7, zmm4, 15
        valignd zmm9, zmm8, zmm7, 15
        vpaddd  zmm4, zmm5, zmm4
        vpaddd  zmm6, zmm6, zmm9
        vpsubd  zmm4, zmm4, zmm7
        vpsubd  zmm5, zmm6, zmm8
        vpandq  zmm6, zmm5, zmm2
        vpandq  zmm7, zmm4, zmm2
        vpmovdw ymm4, zmm4
        vpmovdw ymm5, zmm5
        vpmulld zmm7, zmm7, zmm1
        vpmulld zmm6, zmm6, zmm1
        vpsrld  zmm6, zmm6, 6
        vpsrld  zmm7, zmm7, 6
        vinserti64x4    zmm4, zmm4, ymm5, 1
        vpaddw  zmm4, zmm4, zmmword ptr [rax + 2*rbx]
        vpmovdw ymm7, zmm7
        vpmovdw ymm6, zmm6
        vinserti64x4    zmm6, zmm7, ymm6, 1
        vmovdqu64       zmmword ptr [rax + 2*rbx], zmm6
        vpsubw  zmm4, zmm4, zmm6
        vpsubw  zmm4, zmm4, zmm3
        vpsrlw  zmm4, zmm4, 1
        vpmovwb ymmword ptr [r8 + rbx], zmm4
        add     rbx, 32
        vmovdqa64       zmm4, zmm8
        cmp     r10, rbx
        jne     .LBB0_29
        add     rdi, rsi
        add     r11, 2
        add     r8, r9
        cmp     r11, rdx
        jne     .LBB0_26
        test    cl, 1
        je      .LBB0_34
.LBB0_32:
        vpbroadcastd    zmm2, dword ptr [rip + .LCPI0_0]
        vpternlogd      zmm3, zmm3, zmm3, 255
        vpxor   xmm4, xmm4, xmm4
        xor     ecx, ecx
.LBB0_33:
        vpmovzxbd       zmm5, xmmword ptr [rdi + rcx]
        vpmovzxbd       zmm6, xmmword ptr [rdi + rcx + 16]
        vpaddd  zmm6, zmm6, zmm6
        vpaddd  zmm5, zmm5, zmm5
        vpmulld zmm7, zmm5, zmm0
        vpmulld zmm8, zmm6, zmm0
        vpsrld  zmm7, zmm7, 6
        vpsrld  zmm8, zmm8, 6
        valignd zmm4, zmm7, zmm4, 15
        valignd zmm9, zmm8, zmm7, 15
        vpaddd  zmm4, zmm5, zmm4
        vpaddd  zmm6, zmm6, zmm9
        vpsubd  zmm4, zmm4, zmm7
        vpsubd  zmm5, zmm6, zmm8
        vpandq  zmm6, zmm5, zmm2
        vpandq  zmm7, zmm4, zmm2
        vpmovdw ymm4, zmm4
        vpmovdw ymm5, zmm5
        vpmulld zmm7, zmm7, zmm1
        vpmulld zmm6, zmm6, zmm1
        vpsrld  zmm6, zmm6, 6
        vpsrld  zmm7, zmm7, 6
        vinserti64x4    zmm4, zmm4, ymm5, 1
        vpaddw  zmm4, zmm4, zmmword ptr [rax + 2*rcx]
        vpmovdw ymm7, zmm7
        vpmovdw ymm6, zmm6
        vinserti64x4    zmm6, zmm7, ymm6, 1
        vmovdqu64       zmmword ptr [rax + 2*rcx], zmm6
        vpsubw  zmm4, zmm4, zmm6
        vpsubw  zmm4, zmm4, zmm3
        vpsrlw  zmm4, zmm4, 1
        vpmovwb ymmword ptr [rdi + rcx], zmm4
        add     rcx, 32
        vmovdqa64       zmm4, zmm8
        cmp     r10, rcx
        jne     .LBB0_33
        jmp     .LBB0_34
.LBB0_18:
        vpbroadcastd    zmm2, dword ptr [rip + .LCPI0_0]
        vpternlogd      zmm3, zmm3, zmm3, 255
        xor     r11d, r11d
.LBB0_19:
        vpxor   xmm4, xmm4, xmm4
        xor     ebx, ebx
.LBB0_20:
        vpmovzxbd       zmm5, xmmword ptr [rdi + rbx]
        vpmovzxbd       zmm6, xmmword ptr [rdi + rbx + 16]
        vpaddd  zmm5, zmm5, zmm5
        vpaddd  zmm6, zmm6, zmm6
        vpmulld zmm7, zmm5, zmm0
        vpmulld zmm8, zmm6, zmm0
        vpsrld  zmm7, zmm7, 6
        valignd zmm9, zmm7, zmm4, 15
        vpsrld  zmm4, zmm8, 6
        valignd zmm8, zmm4, zmm7, 15
        vpaddd  zmm5, zmm5, zmm9
        vpaddd  zmm6, zmm6, zmm8
        vpsubd  zmm5, zmm5, zmm7
        vpsubd  zmm6, zmm6, zmm4
        vpandq  zmm8, zmm5, zmm2
        vpmovdw ymm5, zmm5
        vpandq  zmm7, zmm6, zmm2
        vpmovdw ymm6, zmm6
        vpmulld zmm8, zmm8, zmm1
        vpmulld zmm7, zmm7, zmm1
        vpsrld  zmm8, zmm8, 6
        vpsrld  zmm7, zmm7, 6
        vpmovdw ymm8, zmm8
        vinserti64x4    zmm5, zmm5, ymm6, 1
        vpaddw  zmm5, zmm5, zmmword ptr [rax + 2*rbx]
        vpmovdw ymm7, zmm7
        vinserti64x4    zmm7, zmm8, ymm7, 1
        vmovdqu64       zmmword ptr [rax + 2*rbx], zmm7
        vpsubw  zmm5, zmm5, zmm7
        vpsubw  zmm5, zmm5, zmm3
        vpsrlw  zmm5, zmm5, 1
        vpmovwb ymmword ptr [rdi + rbx], zmm5
        add     rbx, 32
        cmp     r10, rbx
        jne     .LBB0_20
        vextracti32x4   xmm4, zmm4, 3
        mov     rbx, r10
        vpextrd r14d, xmm4, 3
.LBB0_22:
        movzx   r15d, byte ptr [rdi + rbx]
        lea     ebp, [r14 + 2*r15]
        add     r15d, r15d
        imul    r15d, r8d
        shr     r15d, 6
        sub     ebp, r15d
        movzx   ebp, bp
        mov     r14d, ebp
        add     bp, word ptr [rax + 2*rbx]
        imul    r14d, r9d
        shr     r14d, 6
        mov     word ptr [rax + 2*rbx], r14w
        sub     ebp, r14d
        mov     r14d, r15d
        inc     ebp
        shr     ebp
        mov     byte ptr [rdi + rbx], bpl
        inc     rbx
        cmp     rdx, rbx
        jne     .LBB0_22
        add     rdi, rsi
        inc     r11
        cmp     r11, rcx
        jne     .LBB0_19
.LBB0_34:
        pop     rbx
        pop     r12
        pop     r13
        pop     r14
        pop     r15
        pop     rbp
        vzeroupper
        ret

Metadata

Metadata

Assignees

No one assigned

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions