https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65914
--- Comment #6 from Bill Schmidt <wschmidt at gcc dot gnu.org> --- The tree-optimized dump shows: void foo() () { vector(2) long unsigned int vect_cst_.60; vector(2) long unsigned int vect_cst_.59; vector(2) long unsigned int vect_cst_.58; struct A p1; const struct A D.3509; int p1; int p1; const struct A D.3508; struct A p1; struct expression D.3507; long unsigned int _5; long unsigned int _6; long unsigned int _8; long unsigned int _11; long unsigned int _18; long unsigned int _19; <bb 2>: _18 = (long unsigned int) &p1; _19 = (long unsigned int) &p1; vect_cst_.60_20 = {_19, _18}; _6 = (long unsigned int) &D.3509; _5 = (long unsigned int) &p1; vect_cst_.59_17 = {_5, _6}; _11 = (long unsigned int) &D.3508; _8 = (long unsigned int) &p1; vect_cst_.58_7 = {_8, _11}; D.3509 ={v} {CLOBBER}; D.3508 ={v} {CLOBBER}; MEM[(struct &)&D.3507] ={v} {CLOBBER}; MEM[(const struct A & *)&D.3507] = vect_cst_.60_20; MEM[(const struct A & *)&D.3507 + 16B] = vect_cst_.59_17; MEM[(const struct A & *)&D.3507 + 32B] = vect_cst_.58_7; operator/<int, A<int>, expression<int, expression<int, int, expression<int, A\ <int>, A<int>, void, void>, void, void>, expression<int, int, A<int>, void, voi\ d>, void, void>, void, void, double> (D.3507, 1.0000000000000000555111512312578\ 27021181583404541015625e-1); return; } The problem is that the POWER port doesn't appear to have a pattern to match the vector constructors like: vect_cst_.60_20 = {_19, _18}; The translation into rtl is a (vec_concat:V2DI (reg:DI) (reg:DI)). The closest thing we have to matching this is vsx_concat_<mode> in vsx.md, but IIUC this will only match (vec_concat:V2DF (reg:DF) (reg:DF)) because of the vsx_register_operand restriction. Mike Meissner, can you please confirm?