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

Reply via email to