On Tue, Jun 30, 2026 at 11:42 PM Roger Sayle <[email protected]> wrote: > > > 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 > > > This patch has been tested on x86_64-pc-linux-gnu with make bootstrap > and make -k check, both with and without --target_board=unix{-m32} > with no new failures. Ok for mainline?
I'll note the documentation of vec_init doesn't state the pattern is not allowed to FAIL, so I think you need to handle the expander failing. Also + if (!REG_P (rpart) && !CONSTANT_P (rpart)) + rpart = force_reg (GET_MODE_INNER (mode), rpart); + if (!REG_P (ipart) && !CONSTANT_P (ipart)) I think there's one extra space after part) and it would be nice to do the icode = convert_optab_handler assignment as part of the if () to not repeat it. Otherwise a good idea. Thanks, Richard. > > > 2026-06-30 Roger Sayle <[email protected]> > > gcc/ChangeLog > PR target/99668 > * expr.cc (expand_expr_real_1) <case VIEW_CONVERT_EXPR>: Use > vec_init_optab to convert a complex number into two-component > vector with the same inner type. > > gcc/testsuite/ChangeLog > PR target/99668 > * gcc.target/pr99668.c: New test case. > > > Thanks in advance, > Roger > -- >
