Skip to content

[LV][SLP][veclib] missed sin+cos/sincos vectorization without sincos veclib #239948

Open

Description

@Andarwinux

https://godbolt.org/z/8erf85MTT

void foo(double *restrict a){
    for(int i=0;i<8;i++){
        a[i]=__builtin_sin(a[i])+__builtin_cos(a[i]);
    }
}

void bar(double *restrict a){
    for(int i=0;i<8;i++){
        double s;
        double c;
        __builtin_sincos(a[i],&s,&c);
        a[i]=s+c;
    }
}

typedef double f64 [[clang::ext_vector_type(4)]];

f64 baz(f64 a){
    return __builtin_elementwise_sin(a)+__builtin_elementwise_cos(a);
}

-O3 -march=novalake -fveclib=libmvec -ffast-math (LV) or with -fno-unroll-loops (SLP)

foo:
        pushp   rbx
        sub     rsp, 144
        mov     rbx, rdi
        vmovsd  xmm0, qword ptr [rdi + 32]
        lea     rdi, [rsp + 72]
        lea     rsi, [rsp + 64]
        call    sincos@PLT
        vmovsd  xmm0, qword ptr [rbx + 40]
        lea     rdi, [rsp + 56]
        lea     rsi, [rsp + 48]
        call    sincos@PLT
        vmovsd  xmm0, qword ptr [rbx + 48]
        lea     rdi, [rsp + 40]
        lea     rsi, [rsp + 32]
        call    sincos@PLT
        vmovsd  xmm0, qword ptr [rbx + 56]
        lea     rdi, [rsp + 24]
        lea     rsi, [rsp + 16]
        call    sincos@PLT
        vmovsd  xmm0, qword ptr [rbx]
        vmovsd  xmm1, qword ptr [rbx + 8]
        vmovsd  qword ptr [rsp + 8], xmm1
        lea     rdi, [rsp + 136]
        lea     rsi, [rsp + 128]
        call    sincos@PLT
        lea     rdi, [rsp + 120]
        lea     rsi, [rsp + 112]
        vmovsd  xmm0, qword ptr [rsp + 8]
        call    sincos@PLT
        vmovsd  xmm0, qword ptr [rbx + 16]
        lea     rdi, [rsp + 104]
        lea     rsi, [rsp + 96]
        call    sincos@PLT
        vmovsd  xmm0, qword ptr [rbx + 24]
        lea     rdi, [rsp + 88]
        lea     rsi, [rsp + 80]
        call    sincos@PLT
        vmovsd  xmm0, qword ptr [rsp + 64]
        vmovhpd xmm0, xmm0, qword ptr [rsp + 48]
        vmovsd  xmm1, qword ptr [rsp + 32]
        vmovhpd xmm1, xmm1, qword ptr [rsp + 16]
        vmovsd  xmm2, qword ptr [rsp + 128]
        vmovhpd xmm2, xmm2, qword ptr [rsp + 112]
        vinsertf128     ymm0, ymm0, xmm1, 1
        vmovsd  xmm1, qword ptr [rsp + 96]
        vmovhpd xmm1, xmm1, qword ptr [rsp + 80]
        vinsertf128     ymm1, ymm2, xmm1, 1
        vinsertf64x4    zmm0, zmm1, ymm0, 1
        vmovsd  xmm1, qword ptr [rsp + 72]
        vmovhpd xmm1, xmm1, qword ptr [rsp + 56]
        vmovsd  xmm2, qword ptr [rsp + 40]
        vmovhpd xmm2, xmm2, qword ptr [rsp + 24]
        vmovsd  xmm3, qword ptr [rsp + 136]
        vmovhpd xmm3, xmm3, qword ptr [rsp + 120]
        vmovsd  xmm4, qword ptr [rsp + 104]
        vmovhpd xmm4, xmm4, qword ptr [rsp + 88]
        vinsertf128     ymm1, ymm1, xmm2, 1
        vinsertf128     ymm2, ymm3, xmm4, 1
        vinsertf64x4    zmm1, zmm2, ymm1, 1
        vaddpd  zmm0, zmm1, zmm0
        vmovupd zmmword ptr [rbx], zmm0
        add     rsp, 144
        popp    rbx
        vzeroupper
        ret

bar:
        pushp   rbx
        sub     rsp, 144
        mov     rbx, rdi
        vmovsd  xmm0, qword ptr [rdi + 32]
        lea     rdi, [rsp + 72]
        lea     rsi, [rsp + 64]
        call    sincos@PLT
        vmovsd  xmm0, qword ptr [rbx + 40]
        lea     rdi, [rsp + 56]
        lea     rsi, [rsp + 48]
        call    sincos@PLT
        vmovsd  xmm0, qword ptr [rbx + 48]
        lea     rdi, [rsp + 40]
        lea     rsi, [rsp + 32]
        call    sincos@PLT
        vmovsd  xmm0, qword ptr [rbx + 56]
        lea     rdi, [rsp + 24]
        lea     rsi, [rsp + 16]
        call    sincos@PLT
        vmovsd  xmm0, qword ptr [rbx]
        vmovsd  xmm1, qword ptr [rbx + 8]
        vmovsd  qword ptr [rsp + 8], xmm1
        lea     rdi, [rsp + 136]
        lea     rsi, [rsp + 128]
        call    sincos@PLT
        lea     rdi, [rsp + 120]
        lea     rsi, [rsp + 112]
        vmovsd  xmm0, qword ptr [rsp + 8]
        call    sincos@PLT
        vmovsd  xmm0, qword ptr [rbx + 16]
        lea     rdi, [rsp + 104]
        lea     rsi, [rsp + 96]
        call    sincos@PLT
        vmovsd  xmm0, qword ptr [rbx + 24]
        lea     rdi, [rsp + 88]
        lea     rsi, [rsp + 80]
        call    sincos@PLT
        vmovsd  xmm0, qword ptr [rsp + 64]
        vmovhpd xmm0, xmm0, qword ptr [rsp + 48]
        vmovsd  xmm1, qword ptr [rsp + 32]
        vmovhpd xmm1, xmm1, qword ptr [rsp + 16]
        vmovsd  xmm2, qword ptr [rsp + 128]
        vmovhpd xmm2, xmm2, qword ptr [rsp + 112]
        vinsertf128     ymm0, ymm0, xmm1, 1
        vmovsd  xmm1, qword ptr [rsp + 96]
        vmovhpd xmm1, xmm1, qword ptr [rsp + 80]
        vinsertf128     ymm1, ymm2, xmm1, 1
        vinsertf64x4    zmm0, zmm1, ymm0, 1
        vmovsd  xmm1, qword ptr [rsp + 72]
        vmovhpd xmm1, xmm1, qword ptr [rsp + 56]
        vmovsd  xmm2, qword ptr [rsp + 40]
        vmovhpd xmm2, xmm2, qword ptr [rsp + 24]
        vmovsd  xmm3, qword ptr [rsp + 136]
        vmovhpd xmm3, xmm3, qword ptr [rsp + 120]
        vmovsd  xmm4, qword ptr [rsp + 104]
        vmovhpd xmm4, xmm4, qword ptr [rsp + 88]
        vinsertf128     ymm1, ymm1, xmm2, 1
        vinsertf128     ymm2, ymm3, xmm4, 1
        vinsertf64x4    zmm1, zmm2, ymm1, 1
        vaddpd  zmm0, zmm1, zmm0
        vmovupd zmmword ptr [rbx], zmm0
        add     rsp, 144
        popp    rbx
        vzeroupper
        ret

baz:
        sub     rsp, 72
        vmovups ymmword ptr [rsp], ymm0
        call    _ZGVdN4v_sin@PLT
        vmovups ymmword ptr [rsp + 32], ymm0
        vmovupd ymm0, ymmword ptr [rsp]
        call    _ZGVdN4v_cos@PLT
        vaddpd  ymm0, ymm0, ymmword ptr [rsp + 32]
        add     rsp, 72
        ret

Since #194616, InstCombine folds sin+cos into sincos, and #194639 splits vector sincos into vector sin + cos when sincos veclib is not available, but LV/SLP is unaware of this. so even if vectorization is actually possible, LV/SLP fails to vectorize.

cc @kito-cheng

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions