https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111657
Bug ID: 111657 Summary: Memory copy with structure assignment from named address space is not working Product: gcc Version: 12.3.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: middle-end Assignee: unassigned at gcc dot gnu.org Reporter: ubizjak at gmail dot com Target Milestone: --- Taken from [1]. Compile the following testcase with -O2 -mno-sse: --cut here-- struct a { long arr[30]; }; __seg_gs struct a m; void foo (struct a *dst) { *dst = m; } --cut here-- the produced assembly: foo: .LFB0: xorl %eax, %eax cmpq $240, %rax jnb .L5 .L2: movzbl %gs:m(%rax), %edx movb %dl, (%rdi,%rax) addq $1, %rax cmpq $240, %rax jb .L2 .L5: ret As rightfully said in [1]: "...and look at the end result. It's complete and utter sh*t: <...> to the point that I can only go "WTF"? I mean, it's not just that it does the copy one byte at a time. It literally compares %rax to $240 just after it has cleared it. I look at that code, and I go "a five-year old with a crayon could have done better". [1] https://lore.kernel.org/lkml/CAHk-=wh+cfn58xxmlng6dh+eb9-2dyfabxjf2ftsz+vfqvv...@mail.gmail.com/