https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87812
--- Comment #3 from H.J. Lu <hjl.tools at gmail dot com> --- Without AVX, v32qi should be passed the same way before AVX was added to compiler. For example, [hjl@gnu-cfl-1 tmp]$ cat z.c typedef int __attribute__((mode(SI))) si; typedef si __attribute__((vector_size (128))) v; v foo (int x) { v y = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f', '0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'}; return y; } [hjl@gnu-cfl-1 tmp]$ gcc -S -O2 z.c [hjl@gnu-cfl-1 tmp]$ cat z.s .file "z.c" .text .p2align 4,,15 .globl foo .type foo, @function foo: .LFB0: .cfi_startproc movq %rdi, %rax movl $48, (%rdi) movl $49, 4(%rdi) movl $50, 8(%rdi) movl $51, 12(%rdi) movl $52, 16(%rdi) movl $53, 20(%rdi) movl $54, 24(%rdi) movl $55, 28(%rdi) movl $56, 32(%rdi) movl $57, 36(%rdi) movl $97, 40(%rdi) movl $98, 44(%rdi) movl $99, 48(%rdi) movl $100, 52(%rdi) movl $101, 56(%rdi) movl $102, 60(%rdi) movl $48, 64(%rdi) movl $49, 68(%rdi) movl $50, 72(%rdi) movl $51, 76(%rdi) movl $52, 80(%rdi) movl $53, 84(%rdi) movl $54, 88(%rdi) movl $55, 92(%rdi) movl $56, 96(%rdi) movl $57, 100(%rdi) movl $97, 104(%rdi) movl $98, 108(%rdi) movl $99, 112(%rdi) movl $100, 116(%rdi) movl $101, 120(%rdi) movl $102, 124(%rdi) ret .cfi_endproc .LFE0: .size foo, .-foo .ident "GCC: (GNU) 8.2.1 20181011 (Red Hat 8.2.1-4)" .section .note.GNU-stack,"",@progbits [hjl@gnu-cfl-1 tmp]$ If there were AVX1024, GCC would pass y in vector register. When AVX1024 were disabled, GCC would pass y in memory and issue an ABI change warning. So LLVM is wrong.