https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101708
Bug ID: 101708 Summary: Suboptimal codegen when clearing struct fields Product: gcc Version: 12.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: rtl-optimization Assignee: unassigned at gcc dot gnu.org Reporter: cafxx+gcc.gnu.org at strayorange dot com Target Milestone: --- GCC trunk (as well as 11.2) currently seem to be performing suboptimal codegen in reset2 and reset3, that in theory should yield the same (or very similar to the) result of reset1: struct example { unsigned a; unsigned char b; unsigned c:1; unsigned d:2; unsigned char f; unsigned char g; unsigned e; }; void reset1(struct example *e) { e->b = 0, e->d = 0, e->e = 0, e->f = 0, e->g = 0; } void reset2(struct example *e) { *e = (struct example) { .a = e->a, .c = e->c }; } void reset3(struct example *e) { struct example tmp = { .a = e->a, .c = e->c }; *e = tmp; } compiled with -O2 -Wall yields: reset1: and QWORD PTR [rdi+4], 63744 ret reset2: movzx eax, BYTE PTR [rdi+5] mov edx, DWORD PTR [rdi] mov DWORD PTR [rdi+8], 0 mov QWORD PTR [rdi], 0 and eax, 1 mov DWORD PTR [rdi], edx mov BYTE PTR [rdi+5], al ret reset3: mov QWORD PTR [rsp-8], 0 mov eax, DWORD PTR [rdi] mov DWORD PTR [rsp-12], eax movzx eax, BYTE PTR [rdi+5] and eax, 1 mov BYTE PTR [rsp-7], al mov rax, QWORD PTR [rsp-12] mov QWORD PTR [rdi], rax mov eax, DWORD PTR [rsp-4] mov DWORD PTR [rdi+8], eax ret Godbolt link: https://godbolt.org/z/asr57TWqq Bug reported at the request of @gnutools: https://twitter.com/gnutools/status/1421525698515251207 I tentatively selected rtl-optimization as the component, but I'm not familiar at all with the internals of GCC: feel free to update as needed.