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.
