https://gcc.gnu.org/bugzilla/show_bug.cgi?id=121898
Bug ID: 121898
Summary: Zero init via member initialization list produces
worse code than memset or default member initializer
Product: gcc
Version: 15.2.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: rtl-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: mwinkler at blizzard dot com
Target Milestone: ---
Created attachment 62365
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=62365&action=edit
Shows 3 different implementations with the member init list resulting in poorer
codegen
Godbolt for those who don't want to use the attached file:
https://godbolt.org/z/3bP7Gr49q.
GCC fails to reduce a member initializer list initializing all fields to zero
down to an inlined memset operation. If using a default member initializer or
memset inside the constructor the code is optimised as expected.
```
#include <string.h>
#if USE_DEFAULT_MEMBER_INITIALIZER
#define DMINIT = 0
#else
#define DMINIT
#endif
struct Test
{
int a DMINIT;
int b DMINIT;
int c DMINIT;
int d DMINIT;
int e DMINIT;
float f DMINIT;
float g DMINIT;
#if USE_MEMSET
Test()
{
::memset(this, 0, sizeof(*this));
}
#elif USE_MEMBER_INIT_LIST
Test()
: a(0)
, b(0)
, c(0)
, d(0)
, e(0)
, f(0)
, g(0)
{
}
#endif
};
Test test()
{
Test t;
return t;
}
```
Both the `USE_MEMSET` and `USE_DEFAULT_MEMBER_INITIALIZER` result in two
128-bit stores.
`USE_MEMBER_INIT_LIST` instead results in different code gen leading to 3
stores.