<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/61396>61396</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            clang AVX2 codegen regression with array of self referencing values
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          reductor
      </td>
    </tr>
</table>

<pre>
    The code generates incorrect code in clang 15.0.0 to the latest trunk on compiler explorer ( 57b78faa9eb08017d95bb4e43242648953b08c13 )

```cpp
struct struct_with_sentinal
{
        struct_with_sentinal()
        {
 m_sentinel = &m_sentinel;
        }
        
        void * m_sentinel;
};

template <typename T, int T_SIZE>
struct fixed_array
{
        T m_data[T_SIZE];
};

fixed_array<struct_with_sentinal, 10240> my_test_array;
```


Current output (with `-std=c++20 -O3 -mavx2`)
```
_GLOBAL__sub_I_example.cpp:             # @_GLOBAL__sub_I_example.cpp
        xor     eax, eax
        lea rcx, [rip + my_test_array]
.LBB1_1:                                # =>This Inner Loop Header: Depth=1
        lea     rdx, [rcx + rax]
 vmovq   xmm0, rdx
        vpbroadcastq    ymm0, xmm0
        lea rdx, [rax + rcx]
        add     rdx, 32
        vmovq   xmm1, rdx
 vpbroadcastq    ymm1, xmm1
        lea     rdx, [rax + rcx + 64]
 vmovq   xmm2, rdx
        vpbroadcastq    ymm2, xmm2
        lea rdx, [rax + rcx + 96]
        vmovq   xmm3, rdx
 vpbroadcastq    ymm3, xmm3
        vmovdqu ymmword ptr [rax + rcx], ymm0
        vmovdqu ymmword ptr [rax + rcx + 32], ymm1
        vmovdqu ymmword ptr [rax + rcx + 64], ymm2
        vmovdqu ymmword ptr [rax + rcx + 96], ymm3
        sub     rax, -128
        cmp     rax, 81920
 jne     .LBB1_1
        vzeroupper
        ret
```

The `vpbroadcastq` and then `movdqu` back into the array ends up generating an array with every 4 elements pointing to the first element not to themselves.

The last known good code gen appears to be in clang 14.0.0 (Based on looking back in compiler explorer)

Compiler explorer link for example code gen:
https://godbolt.org/z/eqx5avca9
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJycVk2PozgT_jXOpdSRsYHAIYcm6bzvSC3NYVur1V4iA0XCtLEZ26TT8-tXBpKQD83MrtWi0q6qp56qMi6EtfVOIS5JlJFoPROd22uzNFh2hdNmluvyc_m2Ryh0ibBDhUY4tFCrQhuDhRsUtYJCCrWDIJrTOQWnwe0RpLd14Eyn3kErKHTT1hIN4LGV2qABwhKIFvkiqYRIMacJDRZlGuV5iCFnIYvDJI14TpMi4EBYSuia0OfxGdPhr2jbYcc60xUOBrH9qN1-a1G5Wgk5uiyyE0L60IolkyDp2Rya0QQlEL4GwuLLDuHZxGN9-X36cdB1CYRNUS4-i_XE3z8dNq0vHBC-cp8tKtEgvBG2glo5eNv-8eXvF8JfrjKu6iOWW2GM-LxP9A2abSmcIFE2ekfrn8SfYvHV4yqtIKAspIS_QPO59U0-OWQ3vblqWP9cdcagcqA713bOnwAPDiSmT9aVhK8LwjLCMkbh6SuHp0YcjswjnRtzjb393-vX7Pl1u7Vdvv2yxaNoWolzfyj4M0wXYRxISH_iMDR7XEdteoni6DP24kovUYApeh2JMlO3QFh2U49oPA7z1ywLtsEtowerJ8nXhL-87WsLX5RCA69at_B_FCUaD7HG1u0JXwf3hPwy5ZlUcexJGXE8U4FDow_ffX5NQ72dN7_CObS50aIshHXeDj5Hw97hvgSXaGKMVkyijUuU5ZQbZzchL5yCa04PyAQjmV-nfyHUyzh8WAX2u1VgY2D2m1XoZRrfFWMSm_8yWz4G5fcY5ffOW3xoU0LrzIMesNXQvX_p2kvOLgjBf0IY6j0gPGj4byAMxRsQbgpgu3xo9_B6PgUsuTYomnZqkAQpOxXim8JedXotr6n9QKO7tkVzvW_Q_eRy80OSxHTaQBJTEKr0o1B53ZCy381F8e6v82FM9lcFoCotdO1pyNZqB0KNuv6GxAOaTwgBJTaonIVW16q3G3Gq2lh3UoPSblQ0FuUB7fyWrhTWwbvSHwp2WpfnGQ-ibVEY693z6XAP--FOWJIJi6Wf6FLrd89gTOh-wt_M7NXdF4Cs1TtU2u_09_CZBeGjz9651vr_2IawzU6XuZZurs2OsM0Pwjb4_RiJQyHSWbnkZcpTMcNlEC-SxYIuUj7bL2kS5TnN4zBZLBinYZ6neUKrsAiDsqjSZFYvGWWc8iCkUcADPq9EnFZFUC1ownkSCBJSbEQt51IeGh97Vlvb4TIOeBrPpMhR2v4bijGFH9ArCfMv0Mwsvc9T3u0sCamsrbMXFFc7icuhvM9__sX67H0LDO4MWltrNTR_OAe6AouyAoMVGlSFL_1ByA7trDNyeVOp2u27fF7ohrCNjziKp9bob1g4wjY9T0vYps_jnwAAAP__kNrw4Q">