https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79709
--- Comment #7 from Marc Glisse <glisse at gcc dot gnu.org> --- Created attachment 41331 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=41331&action=edit recognize a VEC_CONCAT from a constructor (not clean) One piece of the issue is v4di = { v2di, v2di } where we currently generate vmovdqa %xmm3, -48(%rsp) vmovdqa %xmm5, -32(%rsp) vmovdqa -48(%rsp), %ymm0 and the attached patch generates vinsertf128 $0x1, %xmm1, %ymm0, %ymm0 I am not very familiar with expansion and RTL, the patch probably has many issues. I don't know if there is something significantly more general to try. I was tempted to cast (aka subreg) V2DI to TI, construct a V2TI, and cast back to V4DI, since the code nearby is supposed to handle constructors with only scalar elements, but an experiment with __int128 seems to indicate that we don't discover vec_concat for scalars either :-(