https://gcc.gnu.org/bugzilla/show_bug.cgi?id=13423
--- Comment #5 from Oleg Endo <olegendo at gcc dot gnu.org> --- (In reply to Oleg Endo from comment #3) > Although this is an ABI issue, passing float vector by reference should not > actually suffer from this problem, but it does: > > typedef float v4sf __attribute__ ((vector_size (16))); > > void test00 (v4sf& a, const v4sf& b) > { > a += b; > } The reason for that are missing various vec_* patterns, in particular vec_extractv4sf, vec_setv4sf, movv4sf, etc. If those are not specified fallback options will be used by the RTL expansion, which loads/stores the vectors as SImode subregs. Adding vector arithmetic patterns such as addv4sf3 is not necessary, but might simplify a thing or two.