https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99668

--- Comment #6 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Roger Sayle <[email protected]>:

https://gcc.gnu.org/g:ec31d8cb81aa2f9b74c3b91fb87080b9c86cea23

commit r17-2322-gec31d8cb81aa2f9b74c3b91fb87080b9c86cea23
Author: Roger Sayle <[email protected]>
Date:   Fri Jul 10 22:59:24 2026 +0100

    PR target/99668: Improved complex to vector RTL expansion.

    This patch improves the RTL expansion of casts (VIEW_CONVERT_EXPR)
    from complex numbers to two-component vectors with the same inner
    type.  Currently, expand spills the complex number to memory to
    perform this conversion.  With the patch below we now convert the
    V_C_E into the equivalent of (v2x){__real__ z,__imag__ z}, using
    the backend's vec_init_optab.

    The motivating example from the Bugzilla PR is:

    typedef double v2df __attribute__((vector_size(16)));
    v2df foo (_Complex double x)
    {
      return *(v2df *)&x;
    }

    Currently, with -O2 GCC implements this by spilling to memory:

    foo:    movsd   %xmm0, -24(%rsp)
            movsd   %xmm1, -16(%rsp)
            movupd  -24(%rsp), %xmm0
            ret

    with this enhancement to RTL expansion, we now generate:

    foo:    unpcklpd        %xmm1, %xmm0
            ret

    The improvement with -m32 -msse2 -O2 is even more pronounced.

    From:   subl    $28, %esp
            movsd   32(%esp), %xmm1
            movsd   40(%esp), %xmm2
            movsd   %xmm1, (%esp)
            movsd   %xmm2, 8(%esp)
            movupd  (%esp), %xmm0
            addl    $28, %esp
            ret

    To:     movq    4(%esp), %xmm0
            movhpd  12(%esp), %xmm0
            ret

    2026-07-10  Roger Sayle  <[email protected]>
                Richard Biener  <[email protected]>

    gcc/ChangeLog
            PR target/99668
            * expr.cc (try_expand_complex_as_vector): Try to use vec_init_optab
            to convert a complex number to a two-component vector with the same
            inner type.
            (expand_expr_real_1) <case VIEW_CONVERT_EXPR>: Check whether the
            above function can be used to implement this VIEW_CONVERT_EXPR.

    gcc/testsuite/ChangeLog
            PR target/99668
            * gcc.target/i386/pr99668.c: New test case.

Reply via email to