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

    <tr>
        <th>Summary</th>
        <td>
            Copying of adjacent fields can be merged
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            missed-optimization
      </td>
    </tr>

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

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

<pre>
    Saw this on X(https://x.com/joseph_h_garvin/status/1934705584705843340) Assigning adjacent field of struct can be merged as a copy but clang does not recognize it when the data types are different.

Repro:

```cpp
#include <functional>

struct handle {
    void* data; // Replacing it with int data works.
    int index;
};

void remove(handle* p, int idx, int& end)
{
    auto& item = p[idx];
    auto& last = p[end];
    item = last;
    --end;
}

void remove2(handle* p, int idx, int& end)
{
 auto& item = p[idx];
    auto& last = p[end];
    item.data = last.data;
 item.index = last.index;
    --end;
}
```

$ clang -O2
```asm
remove(handle*, int, int&):
        ldrsw   x8, [x2]
 ldr     q0, [x0, x8, lsl #4]
        str     q0, [x0, w1, sxtw #4]
 ldr     w8, [x2]
        sub     w8, w8, #1
        str     w8, [x2]
 ret

remove2(handle*, int, int&):
        ldrsw   x8, [x2]
        add x9, x0, w1, sxtw #4
        add     x8, x0, x8, lsl #4
        ldr w10, [x8, #8]
        ldr     x8, [x8]
        str     w10, [x9, #8]
 ldr     w10, [x2]
        str     x8, [x9]
        sub     w8, w10, #1
 str     w8, [x2]
        ret
```

https://godbolt.org/z/61avd145T
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJysVUuTszYQ_DXiMmWXGB6GAwd7N76m6ksOuW3JaGy0kRFBwo_99Slh4dc6OSSfyoUB9fT09EwhYa3atUQVy1Yse4_E4BrTV43qhVTuLKKNkefqN3EE1ygLpoU_GBaNc51lyZLhmuH6NK_NnuH601jqmo_mYyf6g2oZrq0TbrAM13GZpAueZYW_FmmSpJxhCcsxu2p3IOSnqKl1sFWkJZgtWNcPtYNatLAh2FO_IwnCgoDadGfYDA5qLdodSEMWWuOgp9rsWvVFoBwcG2rBNQRSOAHu3JEF0RNItd1ST62bM75kfPmDut74UsYnlvPLr-46_4iJams9SAKWvG2HtnbKtEKz5JcLPohsRCs1AVusGF8CAByMkgyXY3KWrOBiFPygTova1-sVKteAat1F4dH0f9p5CPdvVSvpxBLPyBbv4YYvPTP0tDcH8o0YE_tMHcO3S5w8hVuGOVArGZYjx6RNDM74LeVoDyx5h45lKx-VhSz3IC2su4I82T3oyuBRt9ezmQdelT_Lxv-i--eKno-WT8rnoUseMO6O1t-27zrxurxpaMIMYRomc_Yr3m8Lu2d8-b1317Kn6n3l40RCWFr29ggAp8KDWLY6oa-JL_3OiPiLTzvjzQWorQaGSRqwYVn3MuQY-6s9ueN9zMR__JZ5Yhs2d4AAwyR-kfA7R0_u4tmLyfg_roQlpIRTOfrxssRHJFypXnr4kBeO8dW9qeTiMfnk3E1d8boPd1TlE9XV_Rvk2X73nKX81_4EotCgf-5MWKFBjwP--PXfGbkx2s1Nv2O4_mK4zmNxkHGa_R7JKpFlUoqIqniR8bgskGPUVGVRLop8k8osJ56hzDAtilhscy7yRb3ASFXIMeN5vECMOce5yGuRY50Xi5LKAmOWctoLpedaH_Y-d6SsHaiK0zSPk0iLDWk7HmqIe2UtyZnpnNqrL-E_4Qx9oVFf-fDZZthZlnKtrLM3QqecpurNdGf_wTbbpzPKPh5N0dDr6skZ5ZphEw5HTxv-Zl1vPql2DNej6PGAvOg-VPh3AAAA___zRBow">