<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/73904>73904</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[InstCombine] Missing optimization: fold `mul (select a, b), (select b, a)` to `mul a, b`
</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/kQGt-z
### Description:
```llvm
define i8 @src(i1 %c, i8 %a, i8 %b) {
%.sink = select i1 %c, i8 %a, i8 %b
%add.sink = select i1 %c, i8 %b, i8 %a
%mul4 = mul i8 %add.sink, %.sink
ret i8 %mul4
}
```
can be folded to:
```llvm
define i8 @tgt(i1 %c, i8 %a, i8 %b) {
%mul = mul i8 %a, %b
ret i8 %mul
}
```
Similarly, for any commutative binary operator like `add`, it's correct too.
### Real-world motivation
This snippet of IR is derived from [redis/src/evict.c](https://github.com/redis/redis/blob/unstable/src/evict.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/v5G3hvs87
**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/eJyUVE2PpDYQ_TXmUhpkDDTNgcPMtFiNlCjKJodcDa5uKmNsZBs2Pb8-MtCZj6xmtZLVNGW_4tVzvZLe08UgNqx8YOUpkXMYrGv-ehyuSWfVtbnXtKCAyVl7Zvk9DCFMnuX3TLRMtHLdTbVextS6CxNtj0y0L0y0z79_CXcvjJ8Yv99_Rb4tOKHvHU2BrImp3p458G3FlFtI4ZkMAh2BFdy7nokjZcBE2TPxuIZFKV__dkzUwKqHDRwjqSfzDCw_gUeNfYDP4RtuDSv1Y2z3Ns0rdpx1seLGWd-293QRcKN1QzgM-6kI3LWoTh9E2V57aaBDOFutUEGwrxL-QLxwCT8n3s7nYx17Ad13yX_O_Q8aSUunrzHH2TqQ5gq9Hcc5yEALQkdGuivYCZ0M1oGmZwR24FKpmCQyDUxUHnrrXLyQYG36_S77ilLffbNOKxhtoEWu_fbm6J8DefCGpgkD2DM8fQXyoNDRggrOzo7AygeHijwT7dp6LS7Uh7Rn5YmJ43szXCgMc5f2dmSivaFuz07bjol2Nj7ITuP_8kXdxVGeAzr4LYeJJtRkkIk6vZFFwH_kOGkE2dkFI1cJDtXco4IFnSdrUng6w9XOTFQOgUxAhz6gAjIQBgTr6EJGavBzZ6dAo9SxbGkUvL5GlT0iSO1jc32o0qrO6rDbPTp9Kb_kw-KP1ftriOsXDDAiPBv7DWglBrF7e2vO5EYIgwy3-5RmY0Av6z2BnSbrwmworL0SBmmefbqlTVSTqzqvZYJNVvEsF3WRlcnQYFEVR9UXvKzzsqiqnsu641mZd7wusMsTagQXeZblnFc5z_JUHbI6yxF5Vsjs0B9ZwXGUpP-baQl5P2NT5TUvEi071H4dlkKsLsvvyfjQ27Fbb0sw8ciEGMl7VHdvC4p75SlxTYTddfPFs4Jr8sG_fipQ0OsofjI-PO45yxP8St6TubwTKA7jOAKiOVaPiuM-olZ_RidvPr2F10ElY_jAIdgbbj994MnsdPNJR6_lbo-7ydm_sQ9MtKs6scFXgf4NAAD__1_l3qo">