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