<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/73831>73831</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[InstCombine] Missing optimization : Canonicalize `select cond, load p1, load p2)` to `load (select cond, p1, p2)`
</td>
</tr>
<tr>
<th>Labels</th>
<td>
llvm:instcombine,
missed-optimization
</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/qnxNDq
Missed example: https://godbolt.org/z/PnTeWE8hq
### Description:
```llvm
define i32 @src(i1 %c) {
entry:
%a = load i32, ptr @A, align 4
%b = load i32, ptr @B, align 4
%A_B = select i1 %c, i32 %a, i32 %b
ret i32 %A_B
}
```
can be canonicalized to:
```llvm
define i32 @tgt(i1 %c) {
entry:
%A_B = select i1 %c, ptr @A, ptr @B
%res = load i32, ptr %A_B, align 4
ret i32 %res
}
```
Though X86 backend generates something like `cmove` for the former, other ISA's backends may not handle it well.
And from IR level, the latter is easier to analyze, while the former resists other optimizations like `GVNSink`, example: https://alive2.llvm.org/ce/z/h5BL-r
### Real-world motivation
This snippet of IR is derived from [redis/src/extr_cluster.c](https://github.com/redis/redis/blob/unstable/src/cluster.c) (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/Te9ear19Y
**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/eJyUVUtv4zYQ_jX0ZRBDoizLOvjgR10E2G6L3aDdngJKHEnTUKSWpJw4v76g5FeySdoFCJEiZz7OfPOgcI5qjbhk6Zql24nofWPs8tumOUwKIw_LlaI9cuisMRVLVtB43zmWrBjfMb4Tw-lUqX07NbZmfFci47tnxnff9dPn7XcWbVm0-o2cQwn4JNpO4Y8wtZGFUf4IEbT_0Hf41y-L5ghw_PJkHLBFV1rqPBkdQMbTeTSOYM24JbEijUAJBzaLnC0ZX1AMjKcl4zkAy9ajIGpvD2ckCBICWLIFZYQM-oxvoPM2wKzCWiiqNcyu5Iv35Ndvy6_u14OGQ4Wlh7NZm9FcnoqrdXFStOhPe6v7o_Es275iYPwthYYCoRTaaCqFomeU4M3_J8zX_icIe9-ha-LOpFwULbq3uRt9_JG9KxIsuo9JuGtMXzfwbTGHQpQPqCXUqNEKjw6cadE3pGtQ9IDA5lHZmj2yeQSVseAbDHOLNhhhfIMWbr-uGM_cCcxBKw6gjYdGaKkQyMMjKjUdb19pCZU1Ldx-AYV7VAEowCrhPVogBygcoQVvQGihDs8YRB4bUnh1P1h05Lw7GmE6Ty09i5D_7mz7r39-_kr6IbjON-8X2wc126TrTzf27ZL7gkLdPBqrJLTG0364_Fr0riEHTlPXoQdTBZfJgURLezyywNK1RUmO8d1QjDt88va-VL3zaKclS7eML161BvJNX0xL0zK-Oymf5kKZgvFdr50XhcIz7AWR58D4QlSB7N8T6KhDRRoZz6cnq_FEFYjC7DEYLcCi7EuUsEfryOgp3FZwMD3jmUUg7dGi8yiB9BAlY6kmLRS4vhiCI1TwX2gJl98QFYcIQrlQhP_VAu8wR2Hj_O-X8QjjE3poER60eQQaDAtVDqXRFdkWfCM8kB_yVOgX2QKm64z1vSZ_GHNR6Ac3HWEncpnIPMnFBJdxFsV8EUVJPmmWcZoJLgtZLdJZKRIZ8Qp5VUQyzhY8T7MJLXnEkzjmeZzNsjifynkiZ0WexlWap9Wcs1mErSB1TrsJOdfjMksWSTxRokDlhjeI86EbJSvSzpemLYZohZ7AOG-Hd-Tm2qFwlm4ndhnUboq-dmwWqVArl6s8eTW8cLfa-c0RM91CeJZC8b8gKBTM5qplhso6trTSaBlIGxpVF1-WnPE8NA1vgvSwx_jildaocJKd9FYtP0j1gYVxuums-QdLz_huIC1k_sDbvwEAAP__gRZZyg">