https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87812
--- Comment #1 from H.J. Lu <hjl.tools at gmail dot com> --- Without AVX, GCC treats typedef qi __attribute__((vector_size (32))) v32qi; as a type of 32 bytes, which is passed in memory. Clang does # clang -S -msse2 x.c -O2 ... movaps .LCPI0_0(%rip), %xmm0 # xmm0 = [48,49,50,51,52,53,54,55,56,57,97,98,99,100,101,102] movaps %xmm0, %xmm1 retq # clang -S -msse2 x.c -O2 -m32 ... movaps .LCPI0_0, %xmm0 # xmm0 = [48,49,50,51,52,53,54,55,56,57,97,98,99,100,101,102] movaps %xmm0, %xmm1 retl They look very odd to me. You either pass it as a vector or you don't. You can't have it both ways.