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
```