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