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

    <tr>
        <th>Summary</th>
        <td>
            Missed optimization when copying large object to multiple targets
        </td>
    </tr>

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

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

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

<pre>
    ```c
#include <string.h>

struct S
{
 alignas(32) char data[176];
};
typedef struct S S;

void copy1(S* dest1, S* dest2, const S* src)
{
    memcpy(dest1->data, src->data, 1);
 memcpy(dest2->data, src->data, 1);
}
void copy8(S* dest1, S* dest2, const S* src)
{
    memcpy(dest1->data, src->data, 8);
    memcpy(dest2->data, src->data, 8);
}
void copy16(S* dest1, S* dest2, const S* src)
{
 memcpy(dest1->data, src->data, 16);
    memcpy(dest2->data, src->data, 16);
}
void copy16b(S* restrict dest1, S* restrict dest2, const S* restrict src)
{
    memcpy(dest1->data, src->data, 16);
    memcpy(dest2->data, src->data, 16);
}
```
-O2

The pointers can't overlap non-exactly, because the member is aligned to greater than the copy's size (and the pointers are tagged restrict in the last one), so a single appropriately-sized read of src->data is sufficient.

Expected:
```
copy1:
        movzx   eax, byte ptr [rdx]
 mov     byte ptr [rdi], al
        mov     byte ptr [rsi], al
 ret

copy8:
        mov     rax, qword ptr [rdx]
        mov     qword ptr [rdi], rax
        mov     qword ptr [rsi], rax
 ret

copy16:
        movaps  xmm0, xmmword ptr [rdx]
        movaps xmmword ptr [rdi], xmm0
        movaps  xmmword ptr [rsi], xmm0
 ret

copy16b:
        movaps  xmm0, xmmword ptr [rdx]
        movaps xmmword ptr [rdi], xmm0
        movaps  xmmword ptr [rsi], xmm0
 ret
```

Actual:
```
copy1:
        movzx   eax, byte ptr [rdx]
 mov     byte ptr [rdi], al
        mov     byte ptr [rsi], al
 ret

copy8:
        mov     rax, qword ptr [rdx]
        mov     qword ptr [rdi], rax
        mov     qword ptr [rsi], rax
 ret

copy16:
        movaps  xmm0, xmmword ptr [rdx]
        movaps xmmword ptr [rdi], xmm0
        movaps  xmm0, xmmword ptr [rdx]
 movaps  xmmword ptr [rsi], xmm0
        ret

copy16b:
        movaps xmm0, xmmword ptr [rdx]
        movaps  xmmword ptr [rdi], xmm0
 movaps  xmm0, xmmword ptr [rdx]
        movaps  xmmword ptr [rsi], xmm0
 ret
```
https://godbolt.org/z/fKr8E16zd
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzsltGOqzYTx5_GuRklAhMIXHBB9mxuPn3qxfYFjJmAK4OpPWSTPH1lSHYTcnp2u62qViqKRMz8Z-Y3ozFGOKfqDjFn8ZbF3xZioMbYvNBSWLMoTXXKWRJMP8mCgvFIdVIPFQKLnhxZ1dWrhkXP3hYUjuwgCV78arNlQQFCq7oTjvE04oxnIBthoRIkWLwNNwmLv7FoO8ovf-jUY4V7uIaCl4sgKA5GVSBNfwoZT18YL6BCRyHjT_C24n4lTedoeuasZDx75wGAFlvZnxhPR-8li55HHv7kxbfL0HuOye99-Kd8fEU3zOnfw5y-M8_dfoSd_h52mHyd-_ONTr5GfeP3gF1euS36MZU0K-Du8bySN-OfGp-_qqq3HciCYvkTnzbDzw1Cb1RHaB1I0TG-ITAHtFr00JluiUchSZ98xBKlGBwCNegxSrSg3LQ1sQIyUFsUhBaoEd2o8j1kfOPAqTMC46noqtHwllJYBBJ1jdV7t9TkrIUjMB36Mnx5BgQ41dUaQfS9Nb1VglCflj64dxcVmP1tGzyeG_Z7JRV2tJoqfj72KAkrFhWzpkzvhPExXK7WHM5HAEBxHDtwIoSeLLB4a6ujf-34ATWHUXxvVd7Kn0Do-3iPUncvtUgT6bTf5zzj3U48v74aWz0CzcQz1TWbj_GR2M3Ed2xh8gAnegdwbNvA-xzb9iM-r3-QXXOOcb4b_vuMV_0MsvxHU97MHwuKQtIg9H-j-e8dzR-H__R0XK5PjfIfLOrjqr7Yra_MfEPUO18V3zG-q01VGk0rY2vGd2fGd_v_2fQ5TM7VosqjKosyscA83MQ8SbMw4osmT9aYCrmJJE9RbNYp4joJZJZuZLIOBZcLlfOAx8EmTMI0iKNglYQyQ57ts3KPIQ8rtg6wFUqvtD60PvdCOTdgHq6zMI4XWpSo3fhpy3mHrzBaGef-S9fm3mlZDrVj60ArR-49DCnSmP9fOYcVmJ5Uq86ClOngtcFuPB1VV4MWtkYw5S8oyR-j7aBJ9dofjLZGcovB6nzWKEXNUK6kaRnf-XyX27K3xodhfDdSOsZ3lzIOOf8tAAD__2OfbY4">