<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">