<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=http://email.email.llvm.org/c/eJzNVltv2zYU_jXyC1FBJiXbevCDY7vD0KIY2gID9mJQ0pHNjiIVkvKS_PodUrIde07jpSg2RY54Obfv8OMhC109znfOtTZii4i-x9eKpoq3uiq0dLE2Wxx6wl_6UPzyNYUP6yhZRcmi___7Tkgg1lVemy1qISVB_VaKWoAlThNOHBeSlFzKiC6J2wGptXkntW7JnhvBlSM1SgRh64xoie5ckLOOl3-ShivRdpI7oVX83Hc0SYa371ImVCm7CkjEllxutRFu10RsfXXeGP54mjtIVFALBeQTSZN88nxur0VFgtLGgAW3QRARnR2RD_aWhdYe5ydvmk7IHsqI5iSa3h2M5ahIvKZ4go0jAoNZkcSnBkITNWI_hyKoGbE7L0LHfgp8L6J3-IpLqwQf7yzDqWwVLNVcWq_Sy3iBaLoaFA6Nf8ISfp3eguuMBGjCAylgK9SABBH6IVDVaaAPMcC8COxycc-7wzJVVm-kRmqRgCNKk80f4-xilT5_cf3Qr8XHxi_reh0CyCJKkW9d6eILtJRGdEEUGm5dZwBbnUKP-FWqQ4L_hcQCreQj4VJsFRmTCgzU-FMl8EL6tQv88Rmi2ZCrEOimU4o3UG14VXkasOSUQ1DOPPo4hvXqVWdhLbfgQEKDIq0zRKjCh2TJayiWr0osjhEuiZikPRMFo0MjjAzx-C18TLSU-yZuoMEkx20iZjGKImwx61N3nrBb0zQLPmcn3_00tscnqgRQY1dw7r_sEJ0BF4K75NGrfJlc0v_thHkb6pfJMf4uOYLvCkr-GAv_978hyrHg_0S2XIK_gTk-o-xf0gc9SI4l4EYgh4pxrBB9WENQQzyiabg_VfNbKt3tR06A3Mm-QIeaujhVfv-0nd3dk0Adwx_O5xq9l-GEoOkhcygG1QO59mAiPYr-6HoYJ0lybu1Bm8FaBlYcjGHrTMozxMfTpxOT-9vHrxcR6_aevBAxLtj9lRR9__h6NUf_RR6-NW3v-1keyFUyjKo5q3KW8xHv3E6b-ecPX0Sj1agz8uISt8W7T1fEpW6w41k7fN61Rn-D0mFXWNuBxUaWJnQ82s3pDGiZZbxMaA15UU75JM9qPh2njE3ZLB9JXoC0c7xkYEnAjaG26K_UFWxBHcsIDd5eHtetE414Cvc562ez1ejHoxdzmlD_sjFLJxmLczZLU57nRT6pEzbLMK_QYGGKwxbGa-3IzIPJottav7OFdfY0ya3FKgQQwGKETjgJ8_dowO9vvKqWBriDvtb1K9eXPH-9u04_tia10c3x-jsKEOYh_r8BTmVWdw>54021</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            Failure to create tail memset call for std::array<bool> from for-loop
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            clang:codegen,
            llvm:codegen,
            llvm:optimizations
      </td>
    </tr>

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

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

<pre>
    https://simd.godbolt.org/z/4xbGT4eKE

While std::fill simplifies to a tail call, the for-loop variant fails to strip out the stack manipulation.

```
#include <algorithm>
#include <array>

#define N 4096

void array_reset_for(std::array<bool,N>& vec) {
        for (size_t i = 0, e = vec.size(); i != e; ++i) {
            vec[i] = false;
    }
}
void array_reset_fill(std::array<bool,N>& vec) {
        std::fill(vec.begin(), vec.end(), false);
}
```
```
define dso_local void @_Z15array_reset_forRSt5arrayIbLm4096EE(%"struct.std::array"* nocapture noundef nonnull writeonly align 1 dereferenceable(4096) %vec) local_unnamed_addr #0 {
entry:
  %vec8 = getelementptr inbounds %"struct.std::array", %"struct.std::array"* %vec, i64 0, i32 0, i64 0
  call void @llvm.memset.p0i8.i64(i8* noundef nonnull align 1 dereferenceable(4096) %vec8, i8 0, i64 4096, i1 false), !tbaa !3
  ret void
}

define dso_local void @_Z16array_reset_fillRSt5arrayIbLm4096EE(%"struct.std::array"* noundef nonnull align 1 dereferenceable(4096) %vec) local_unnamed_addr #1 {
entry:
  %arraydecay.i.i.i = getelementptr inbounds %"struct.std::array", %"struct.std::array"* %vec, i64 0, i32 0, i64 0
  tail call void @llvm.memset.p0i8.i64(i8* noundef nonnull align 1 dereferenceable(4096) %arraydecay.i.i.i, i8 0, i64 4096, i1 false) #3, !tbaa !3
  ret void
}
declare void @llvm.memset.p0i8.i64(i8* nocapture writeonly, i8, i64, i1 immarg)
```
```
array_reset_for(std::array<bool, 4096ul>&):
        pushq   %rax
        movl    $4096, %edx                     # imm = 0x1000
        xorl    %esi, %esi
        callq   memset@PLT
        popq    %rax
        retq
array_reset_fill(std::array<bool, 4096ul>&):
        movl    $4096, %edx                     # imm = 0x1000
        xorl    %esi, %esi
        jmp     memset@PLT 
```

</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzNVk1v2zgQ_TXyhaggUZJjHXxwbHexaFEs2gIF9mJQ0shmlyIVkvI6-fU7pGQ71jqNG6DYVeSIH8PhvMfHIQtVPc531rYmSBYBfY-v4U0VblVVKGFDpbfY9IS_9FD89jWFD-sgWgXRov__bccFEGMrNzpZ1FwIguNbwWsOhlhFGLGMC1IyIQK6JHYHpFb6nVCqJXumOZOW1GjhjY3VvCWqs97OWFb-RRomedsJZrmS4fO5g2k0vH2VJlyWoquABMmSia3S3O6aIFlf7deaPZ77jhYV1FwC-UTSKJ8-79srXhE_aKPBgN0giIDOTsgHf8tCKYfzk3NNp2QPZUBzEtzdH53lOJC4kfwJNpZwDGZFIkcN-CKOCF0fmuDIILl3JjR2XeBqAb3Hl4-9EnzcZBl2ZSvvqWbCuCG9jTMI7lbDgGPh37C4W6e34LoQAbpwQArYcjkgQYSuCWR1buhD9DBHgY0X97I6LFNl1EYolBbxOII02vwZZ6NV-vzF9k2_Fx8bt6zrtQ8gCyhFvXWlDUdoKQ3ogkh03NpOA5Y6iTPiV8oOBf43CguUFI-ECb6VJCYVaKjxJ0tghXBr5_XjGKLZwJUPdNNJyRqoNqyqnAyS6MwhSKsfXRzDevVDZ34tt2BBQIMmrdWEy8KFZMhrKJavWixOES4Jn6a9EnlCh4JvGeJxW_hEtBD7JmygQZLDNuKzEE0RNp_11F0SditNMz_n7Dx3343l-CwVDyq2BWPumxyj02B9cGMdvaqX6Vj-bxfM21C_LI74h-Lwc1dQsseQu7__jVBOCf8XqmUM_gblOEaTn5QPziAYpoAbgRwzxilD9GENQQ3x8KZh7lTNb8l0tx85HnIn-gTtc-rinPnd03Zm90C8dDQ7XPY1ai_8CUHTI3NoBtWBXHuQSIeiP7oOcRRFl94OSg_eMjD86AxLF1ZOIS6enk4k94-PX0cRq_aBvBAxLtjDFYp-fHy9ytF_wcP3pu3nfsYDuSqGSTVPqjzJ2cRyK2D-HjeakxvenEoNzEK_9XpH_Q50t43rbCRrUmvVnG5jk06L0U1wixeorghL1WDFSX_4vGu1-g6lxSo3pgODhSyNaDzZzVmdlnGaV_mszutpmcc0KstpcUfZXZnmtJgIVoAwc7ypYF7B3SW3OF-pKtiCPOUi6md7uV21ljf8yV8KjevNVhM-pxF1bxIn6TRLwjyZpSnL8yKf1lEyy5BaaJCg0O9ivNlO9NzDKbqtcZubG2vOncwYTEQAPlT0zzq7U3r--cMX3ig58cjnHvY_MAJBbQ">