https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104588
Bug ID: 104588 Summary: user-defined constructor loses alignment information about `*this` Product: gcc Version: 11.2.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: lh_mouse at 126 dot com Target Milestone: --- Target: x86_64-linux-gnu https://gcc.godbolt.org/z/M3YoaYeEf ```c++ struct alignas(16) foo { unsigned char a[32]; foo() : a() { } };t struct alignas(16) bar { foo f; long m,n,p,q; bar() : f(),m(),n(),p(),q() { } }; constexpr void* operator new(unsigned long, void* p) noexcept { return p; } inline void operator delete(void*, void*) noexcept { } bar* construct(bar* p) { return new(p) bar(); } ``` For `bar::bar()` with -O3, GCC generates two `MOVUPS` followed by two `MOVAPS`, while Clang generates four `MOVAPS`. `MOVUPS` was slow on some older CPUs. GCC output: ``` construct(bar*): pxor xmm0, xmm0 mov rax, rdi movups XMMWORD PTR [rdi], xmm0 movups XMMWORD PTR [rdi+16], xmm0 pxor xmm0, xmm0 movaps XMMWORD PTR [rdi+32], xmm0 movaps XMMWORD PTR [rdi+48], xmm0 ret ``` Clang output: ``` construct(bar*): # @construct(bar*) mov rax, rdi xorps xmm0, xmm0 movaps xmmword ptr [rdi + 48], xmm0 movaps xmmword ptr [rdi + 32], xmm0 movaps xmmword ptr [rdi + 16], xmm0 movaps xmmword ptr [rdi], xmm0 ret ```