<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/85836>85836</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[InstCombine] Missed optimization: merge consecutive loads whose value merged by `or`
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
XChy
</td>
</tr>
</table>
<pre>
Alive2 proof: https://alive2.llvm.org/ce/z/4NU29y
### Motivating example
```llvm
define i32 @src(ptr %p) {
entry:
%incdec.ptr = getelementptr i8, ptr %p, i64 1
%load1 = load i8, ptr %incdec.ptr, align 1
%conv1 = zext i8 %load1 to i32
%shl = shl nuw nsw i32 %conv1, 8
%load2 = load i8, ptr %p, align 1
%conv18 = zext i8 %load2 to i32
%or = or disjoint i32 %shl, %conv18
ret i32 %or
}
```
can be folded to:
```llvm
define i32 @tgt(ptr %p) {
entry:
%load = load i16, ptr %p, align 1
%conv = zext i16 %load to i32
ret i32 %conv
}
```
Interestingly, x86 and aarch64 backends merge the load, but arm doesn't: https://godbolt.org/z/acGc9M9G8
### Real-world motivation
This snippet of IR is derived from [openssl/crypto/des/ofb_enc.c@DES_ofb_encrypt](https://github.com/openssl/openssl/blob/dc9bc6c8e1bd329ead703417a2235ab3e97557ec/crypto/des/ofb_enc.c#L24) (after O3 pipeline).
The example above is a reduced version. If you're interested in the original suboptimal IR and optimal IR, see also:https://godbolt.org/z/PGG7eEsxd (it's somehow vectorized... a bit weird)
**Let me know if you can confirm that it's an optimization opportunity, thanks.**
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyUVUtv4zYX_TX05mIEiXovvEjicRBg8n3FtAW6G_BxZXFCkQJJ2XF-fUHJsePMNNMCgi1K5x6e-zgi817tDOKalLek3KzYFHrr1n_d9ccVt_K4vtFqjxRGZ21H8hvoQxg9yW8I3RK6ZfPbROv9kFi3I3QrkNDtC6Hb4n9_0vZI0g1Jb06_NF8ueLRB7VlQZgf4zIZRI1wBq3S5Iu_ySGKnDILKKZAi9U4Q2ozBAaHlSGgLpL5dgGiCO0Z98woiQBkhUSQzPN_ADgNqHNCE-EQ1hN7BheoOVFVA9iZcWyazOTLeXQdcqONDptXOXMUKa_ZL7As-B1DNhTDYmM0brO_1jIz_ZjqA8Ycl3xNN3KF5p4v-g67xAznNz_TQH_XYpVzWgVT-u1UmvMrxvY78Z8LXIIdniHWnVtabdz1dloIZ4Aid1RIlBHvu2C97H3bhP_R-Ls2lRln174r0pkRZdea5LtGbbGPIx_k-mIAOfRx5fYz7wnNTATMSGHOirwrgTDyhkR4GdDuE0OOsOWL5FIC5AaRFbwitw49G3FnJrQ4nE0b_MXEv2sf2vvm5Bb8i058O1mkJw8mN1ryF_tErD96occQAtoOHr6A8SHRqjxI6Zwcg5a0d0Xivo_HdcQyW0K1ET-jWdvwbGpEIUqSbz79_O60jiJQbQpt3-lXoJ54IO8TYM-nljmvLI7louahEgxmXOW2RyTrNi6xmlOYl4zm2dVnWKD4SRPMvtJgHhzasC-jg_zmMakStDBLaJq8FwPPXiXG7x5g_A4dyEihhj84raxJ46OBoJ0Jrh6BObUYJysw9tE7tlGEa_MTtGNTAdCxl7PxlGZvsEYFpH53wq9b-dn9f42f_LGMGKhBae_B2wN4eYI8iWKdeUCZJAgy4CnBA5SSh7fUkxOsLBhgQnow9gJrzgOhMYU2n3AChZwFOGzCzCFYv86iAHUfrwmRUmOc59Mw8-WShXcl1Ltu8ZStcZ3WWNnVWNNmqX-dtV2EusMAqZaKkshFtUTVdVnJaSV6v1JqmtEjzrM2atCiyhJU05awuRdOmAtuKFCkOTOnzmbNS3k-4bsomr1aacdR-PswoNXiA-SWhNJ5tbh1jPvFp50mRauWDv7AEFfR8Cj4YH-7swOMslBt4VN6jvEo9um8xqbDGo5iC2i9m9XDorUfYMz3hgpHAj0Cq1DpSpavJ6fUHgz9_85a_T6Oz31EEQrdzDnGE5xz_DgAA__9DZFHX">