https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104723
Bug ID: 104723 Summary: [12 regression] Redundant usage of stack Product: gcc Version: 12.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: target Assignee: unassigned at gcc dot gnu.org Reporter: crazylht at gmail dot com Target Milestone: --- Host: x86_64-pc-linux-gnu Target: x86_64-*-* i?86-*-* bool f256(char *a) { char t[] = "012345678901234567890123456789012345678901234567"; return __builtin_memcpy(a, &t[0], sizeof(t)) == 0; } https://godbolt.org/z/jcjbT4d8e gcc12 generates vmovdqa64 ymm31, YMMWORD PTR .LC0[rip] xor eax, eax vmovdqu64 YMMWORD PTR [rsp-72], ymm31 vmovdqa64 ymm31, YMMWORD PTR .LC1[rip] vmovdqu64 YMMWORD PTR [rsp-55], ymm31 vmovdqu64 ymm31, YMMWORD PTR [rsp-72] vmovdqu64 YMMWORD PTR [rdi], ymm31 vmovdqu64 ymm31, YMMWORD PTR [rsp-55] vmovdqu64 YMMWORD PTR [rdi+17], ymm31 Why build “unaligned string" by stack instead of putting it directly into the constant pool. gcc 11 seems fine. f256(char*): vmovdqa xmm0, XMMWORD PTR .LC0[rip] mov BYTE PTR [rdi+48], 0 vmovdqu XMMWORD PTR [rdi], xmm0 vmovdqa xmm0, XMMWORD PTR .LC1[rip] xor eax, eax vmovdqu XMMWORD PTR [rdi+16], xmm0 vmovdqa xmm0, XMMWORD PTR .LC2[rip] vmovdqu XMMWORD PT