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

    <tr>
        <th>Summary</th>
        <td>
            Adjacent Loads Can't Optimize To Larger Transfers
        </td>
    </tr>

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

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

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

<pre>
    Using example code like
```cpp
void cpy_half(char* restrict dst, char* restrict src) {
    *dst++ = *src++;
    *dst++ = *src++;
}
```
which becomes more common during loops (e.g. when using `-fno-builtin-memcpy`), LLVM is currently unable to optimize this to a single halfword load -- The same extends to word loads and larger! Normally this isn't quite as apparent because vectorizers can turn larger transformations into the optimal results, but without those it leaves only individual loads and stores

To be more specific, the following transformation should be possible to occur (afaik, I don't know all relevant flags;;):
```llvm
define void @src(ptr noalias %dst, ptr noalias %src) {
entry:
  %0 = load i8, ptr %src, align 1
  store i8 %0, ptr %dst, align 1
  %src_next = getelementptr inbounds i8, ptr %src, i64 1
  %dst_next = getelementptr inbounds i8, ptr %dst, i64 1
  %1 = load i8, ptr %src_next, align 1
  store i8 %1, ptr %dst_next, align 1
 ret void
}

define void @tgt(ptr noalias %dst, ptr noalias readonly %src) {
entry:
  %0 = load i16, ptr %src, align 2
  store i16 %0, ptr %dst, align 2
  ret void
}
```

Note that certain targets do this optimization on their own to some extent (e.g. Aarch64, PowerPC, WASM), but most don't seem to (e.g. x86-64, ARM32, RISC-V)

Tested with Clang trunk on Godbolt
Link: https://godbolt.org/z/eWxsKhrxv
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyUVdtu2zgQ_Rr6ZWBDoi1fHvzgOHBRbNIt2mz7WFDi2GJDcbTkyJd8_YKUnU28ze4GMGR5PHPmcoaHKgSzc4hLUdyI4nagOq7JLz8gsbI4KEmfln8E43aAR9W0FqEijWDNI4rsVmQrMc36T9W2vWVPRkPVnn7Uym6FnFe18kKuwGNgbyoGHVjINfzDHnwl5ALE7KYHAgAQcpXcb4S8ATG-jYbkFw1i_G5PMbu9qrv_eahNVUOJFTUYoCEfG20acqA7H9u3RG0AIec42o3gUKODLs1FTLPh1tGw7Ixl44YNNlV7isByEdu8u_t2DyZA1XmPju0JOqdKi8AE1LJpzBMC1yZEg4KIaRHi7A7kNVhSGoZDeKgRgmoQ8MjodPJ-dgignAar_A69kDl8It8oa089rglOyBnDn51hBBVAta2KtcR-VRcQ9lgxefOEPkClHHDn3RkO2CsXthGQDbkAxjEB19gXr2zkr7McYq9lx3AwXFPHwDUFBMNgUe0xADl7AuO02RvdKfui7sDkMZxpSc8HghJ7FkKLldmaKsLHrFuylg5x8K8Lg1BTZ3WMaykEc5lwVXU-0qa2yjxGkI-gqZ_Ho6MDKBs7sLhXjmFr1S7EXRnfRPbGq6tdsXbf9CaNW-MQ0q6LSZYWbd6yB0fKGhU3pTjv-ZX1esvRsT89p4p7XGRpfxPzZn6BuISuQVmzc5BfAtL4wMxT5Avvc_or7x7mh8Mjpyw7ZLTYoOMYZlxJXdyuX-U108krHB34fTjniq5x8rfbTfj_0XP-OsMbIR45sXUtA79ik3f8v9j0qHRa6_fTmk_f4lVe9ZhP_5XYZ_e3Gnytc_3zE3HUHMVQoWdlHHA87BxAU68ZZ2Xqjxa5ePSMBzq4eKgCXXSInxVxpXxVTyexsM90QP95HV-_r77en3UwakNDgZ-PX0BsItoF4TifDnuA1Zf7sYwvXz5-XQ-_RYCX4oCBUSedgbVVSQk69xir_EC6JMu9351xj2K8gpq5DZEJuRFys-tdRuR3Qm6ehNzg92P4rfbH_UAvx3oxXqgBLvNZXhRFNsvGg3pZTbaLQs3mE6mqfJoXOapssV2My1m5KHNZDsxSZnKSFbmUeZFPxqOFyueTIp_OcpXJbanFJMNGGTuKChJzD0wIHS4X-SKTA6tKtCFdwVI6PED6U0gZb2S_jDHDstsFMcmsCRz-RmHDFpcr_VNVkYy7pKlr1Q_498vt8kBw14v5Q9JM9GHQebu8mozhuitHFTVCbpLS9V_D1tNPrFjITaorCLlJdf8VAAD___hxj1o">