https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89252
Bug ID: 89252 Summary: Vector load/store aren't used to initialize large memory Product: gcc Version: 9.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: tree-optimization Assignee: unassigned at gcc dot gnu.org Reporter: hjl.tools at gmail dot com Target Milestone: --- [hjl@gnu-cfl-2 tmp]$ cat /tmp/x.i struct S { void *s1; unsigned s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14; }; const struct S array[] = { { (void *) 0, 60, 640, 2112543726, 39682, 48, 16, 33, 10, 96, 2, 0, 0, 4 }, { (void *) 0, 60, 2112543726, 192, 18251, 16, 33, 10, 96, 2, 0, 0, 4, 212 } }; void foo (struct S *x) { x[0] = array[0]; x[5] = array[1]; } [hjl@gnu-cfl-2 tmp]$ gcc -S -O2 x.i [hjl@gnu-cfl-2 tmp]$ cat x.s .file "x.i" .text .p2align 4,,15 .globl foo .type foo, @function foo: .LFB0: .cfi_startproc movq $0, (%rdi) movl $60, 8(%rdi) movl $640, 12(%rdi) movl $2112543726, 16(%rdi) movl $39682, 20(%rdi) movl $48, 24(%rdi) movl $16, 28(%rdi) movl $33, 32(%rdi) movl $10, 36(%rdi) movl $96, 40(%rdi) movl $2, 44(%rdi) movl $0, 48(%rdi) movl $0, 52(%rdi) movl $4, 56(%rdi) movq $0, 320(%rdi) movl $60, 328(%rdi) movl $2112543726, 332(%rdi) movl $192, 336(%rdi) movl $18251, 340(%rdi) movl $16, 344(%rdi) movl $33, 348(%rdi) movl $10, 352(%rdi) movl $96, 356(%rdi) movl $2, 360(%rdi) movl $0, 364(%rdi) movl $0, 368(%rdi) movl $4, 372(%rdi) movl $212, 376(%rdi) ret .cfi_endproc We can do foo: .LFB0: .cfi_startproc movdqa array(%rip), %xmm0 movdqa array+16(%rip), %xmm1 movdqa array+32(%rip), %xmm2 movdqa array+48(%rip), %xmm3 movdqa array+64(%rip), %xmm4 movdqa array+80(%rip), %xmm5 movups %xmm0, (%rdi) movdqa array+96(%rip), %xmm6 movdqa array+112(%rip), %xmm7 movups %xmm1, 16(%rdi) movups %xmm2, 32(%rdi) movups %xmm3, 48(%rdi) movups %xmm4, 320(%rdi) movups %xmm5, 336(%rdi) movups %xmm6, 352(%rdi) movups %xmm7, 368(%rdi) ret .cfi_endproc