<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/151512>151512</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Suboptimal filling of plain struct with default member initializers
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
DymOK93
</td>
</tr>
</table>
<pre>
Consider creating a large plain struct with default member initializers (example taken NDA code and simplified to MRE):
```cpp
struct IMemAllocator {
virtual ~IMemAllocator() = default;
};
struct Data
{
const void* p = nullptr;
size_t sz = 0;
};
enum class HA : uint32_t
{
None = 0,
Max = 2
};
enum class CA : uint32_t
{
None = 0,
Max = 2
};
enum class Flags : uint32_t
{
None = 0x0
};
struct Ctx
{
HA pha = HA::Max;
HA cha = HA::Max;
CA ca = CA::Max;
Flags flags = Flags::None;
Data d1 = {};
Data d2 = {};
Data d3 = {};
Data d4 = {};
Data d5 = {};
Data d6 = {};
Data d7 = {};
};
struct Ctx2
{
Data d1 = {};
size_t count = 0;
Data* pd1 = nullptr;
Data* pd2 = nullptr;
Data* pd3 = nullptr;
IMemAllocator* pa = nullptr;
};
struct ACtx
{
int id = 0;
int indexes[12] = {0};
int id2 = 0;
bool f1 = false;
bool f2 = false;
bool f3 = false;
};
struct Data2
{
bool f = false;
std::byte h[32] = {};
};
struct State
{
std::array<Ctx, 16> ctx = {};
std::array<Ctx2, 16> ctx2 = {};
std::array<ACtx, 24> actx = {};
Data2 cache[2] = {};
//
//
//
State(IMemAllocator* pa)
{
for (uint32_t i = 0; i < 16; ++i)
ctx2[i].pa = pa;
}
};
```
For example, for x64, a bunch of `mov`/`movups` is generated, which looks less efficient than `memset()` and loop, as would be the case without initializers: https://gcc.godbolt.org/z/T6YvYrshd.
Performance comparison: https://quick-bench.com/q/2vm1he3nglBqPyeBtNhe4l9ulfI
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJysVk9v27gT_TT0ZVBDIi0pOugg2TVS_JD-iu1eeiooamRxS5GqSDlODvvZF5QUx3bU7C6wgYAQfPPe_OGYQ26tPGjEjEQFiXYrPrjG9Nnuqf3__1K2Kk31lG2NtrLCHkSP3El9AA6K9weETnGpwbp-EA4epWugwpoPykGLbYk9SC2d5Eo-Y2-B0Ds88bZTCI7_QA2fdzkIUyFwXYGVbadkLbECZ-Dht4-EpoTlJMhJHEyf6DoS5LO7Tw_Y5koZwZ3pgSQFCXIAgKPs3cAV_HllQOgdoSkQtnsJkTDPIMluXpyFd9zxEZm2U2G0dXA0siI0h27U0INSnetfqKmVz_jdgX0e0eCtNuqhBaG4tXCfA2E5DFI7Rr87uPT12WicJeh2TuiBn8Yt-mvJ7X8vuVf8YK9Ul0VPwXIVt-50JgAJ0vscuoaPnPvcnyvLH_iJsAImxfscxCI-wdscxIRuF9Ap2HoOeTcFP5n5SM92_mihCkcbH9oYNlxi9Abzf5c4u8Yvoc07stGt7CUYv0NMFrDFYtPL41nM86pThRm0u2rWiTW2-My8bfJXnP4Nzhbxmx9kDh1fsHubXX7ZSyRIpXYgq5vgx01d4QktiYqQkmj3kn5wmf9Epjfs0hgF9ZR2zZXFG4T-EmFvkOUb5ep8JuqCpnXV1Lblk0NoSFSwy0xetd86-eq4w0snZy3e9_yJsK0vI91CGBP2EYQ7LbbHAoleseg_ouWzM7rxNP4Lb2NhQHDRIImK5UxHQ0L3_nt3PRWA3i20mR8lk_1LcUiQ1n5s0LvzpSnPPTEup5QLILQgtJCvEuPnC0GiQpJot57buOPnvHz0l4f0MsBIkO9ND_MU9PXxQZzijV9yKActGjA1kDhozdET6H5aD50lcQDSwgE19txh5TmPjRQNKGN-WFBoLWBdSyFRO3AN16MQthbdNP-8hJ-1yphudGnh0QyqghLBNQiCWxznuBnc1ez2c6Bxrhsv1bHmByHWB1OVRrm16Q-E7p8J3f8efzt-621Trf1N9QX72vQt1wJBmLbjvbRGv9X6OUjx40OJWjRrYVq_Q-ieHtuwQaYPqvj55QkL97nBjUoHVX9aVRmrUpbyFWZhErE0TmgSrJpsw9MkYgkXPOVlWSUhj8NE0CgJWRqzsF7JjAY0ChIWhixINpv1Jow3LAzDmHOOYVKTTYAtl2qt1LH1ma2ktQNmYRRGIV0pXqKy42uJUo2PMKKE-t5d9ZknfSiHgyWbQEnr7KuMk05h9nUoTedkyxXUUin_mDL1v3tHrYZeZTeHIV0zlHPtvMf534euN3-gcITuxzgtofs5kWNG_woAAP__1vrN8g">