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

    <tr>
        <th>Summary</th>
        <td>
            Missed optimization: Redundant array assignment
        </td>
    </tr>

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

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

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

<pre>
    The following reduced code makes the same assignment to array `a` twice, the second time being redundant.

https://godbolt.org/z/8Kods3soK

```cpp
int a[1024];
int b[1024];

void func()
{
    for (int i = 0; i < 1024; i+=1) {
        a[i] = b[i] * 2;
    }

    for (int i = 0; i < 1024; i+=1) {
        a[i] = b[i] * 2;
 }
}
```

Clang:
```asm
func: # @func
        xor     edx, edx
        lea     rax, [rip + b]
 lea     rcx, [rip + a]
.LBB0_1:                                # =>This Inner Loop Header: Depth=1
        movdqa  xmm0, xmmword ptr [rax + 4*rdx]
        movdqa  xmm1, xmmword ptr [rax + 4*rdx + 16]
 movdqa  xmm2, xmmword ptr [rax + 4*rdx + 32]
        movdqa  xmm3, xmmword ptr [rax + 4*rdx + 48]
        paddd   xmm0, xmm0
        paddd   xmm1, xmm1
        movdqa  xmmword ptr [rcx + 4*rdx], xmm0
        movdqa xmmword ptr [rcx + 4*rdx + 16], xmm1
        paddd   xmm2, xmm2
 paddd   xmm3, xmm3
        movdqa  xmmword ptr [rcx + 4*rdx + 32], xmm2
        movdqa  xmmword ptr [rcx + 4*rdx + 48], xmm3
        add rdx, 16
        cmp     rdx, 1024
        jne     .LBB0_1
 xor     edx, edx
.LBB0_3:                                # =>This Inner Loop Header: Depth=1
        movdqa  xmm0, xmmword ptr [rax + 4*rdx]
 movdqa  xmm1, xmmword ptr [rax + 4*rdx + 16]
        movdqa  xmm2, xmmword ptr [rax + 4*rdx + 32]
        movdqa  xmm3, xmmword ptr [rax + 4*rdx + 48]
        paddd   xmm0, xmm0
        paddd   xmm1, xmm1
 movdqa  xmmword ptr [rcx + 4*rdx], xmm0
        movdqa  xmmword ptr [rcx + 4*rdx + 16], xmm1
        paddd   xmm2, xmm2
        paddd xmm3, xmm3
        movdqa  xmmword ptr [rcx + 4*rdx + 32], xmm2
 movdqa  xmmword ptr [rcx + 4*rdx + 48], xmm3
        add     rdx, 16
 cmp     rdx, 1024
        jne     .LBB0_3
        ret
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzUVk2TozYQ_TXNpWtdQgLbHDiYIa6kdnNJ7SW5pGTUY2sDiEjyjHd_fUrCHsN87Eeyk0ooFwL166enlp_d0jm974lKyCvI60Qe_cHY8rdf82yZ7Iz6WL4_EN6atjX3ut-jJXVsSGFjFGEn_yCH_kDoZEc4cnXUe_QGpbXyI8KSSVgy9Pe6IeA3I5oa0yv0uiPc0YW2V7L3C2A1sM14P3g_OBAb4Fvg271RO9P6hbF74NtPwLfrt0Y54czbaRIs2fhphmGc0b1HCXmVMp5BXoOorvO7Z-bH-53RCm-PfQN8Dbw4h1ZnDCLirbEIfB1oNIKokYGo4uMNRs7wBrwCUafAC5wlhyuI0pDXMXn38MI3yB_EBBys6qmyf2_t68IPD5fqTgXdtLLfh3OaQ6TrxplYRbFB4AIhY_F1JuZkbBxJncJ3JAyzeEsyjlbGOOSV1QMCr4Lys7IrqHkMkg-gxbuqYr-nQcwXrqhV1CB-eH_QDn_qe7L4zpgBfySpyAaKmgZ_iBWeqe3MnfpTIp66jgUlp667N1bh4G1UJU9RVQZ8Y9XpuoGn6emX0-NzuryyTNL5V6YL_jkR4itZsvUTlkEqpXBWCfYi4rLZl6s5U9A8qeKzC5zTP589KeKzGiYqLzXlZ8QkdCmU-DsbmBzEfIFvZxkP4lktUim0o8nS5TzUdMNon3M4_IjMAB96iuPFQ2PwJeuOKPHfdNo_tNjT1f_fTvs-Fns9j80Qr2a07-ewqY0uLvtGez1iteQf_bkmqhSqEIVMqExXqSjyfL3Mk0PZsCwXtCIheFOsl2uSKmW3oiElZJYXeaJLznjGMp6lLE9ZvlixYsXTVSEES1cyk5Ax6qRuF21714V2K9HOHalcF0XKk1buqHWxX-S8p3uMQeChooktQ86b3XHvIGOtdt5dWbz2LZU_a-dIoRm87vQn6bXpg8N_uXSA58bx2kwmR9uWj1pB7Q_H3aIxHfBt4D8PbwZrPlDjgW-jKheaxKD6rwAAAP__v_XvlA">