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

    <tr>
        <th>Summary</th>
        <td>
            [InstCombine] Missed optimization: fold `((select C1, C2) | A) ^ C3` to `(select C1^C3, C2^C3) | A)`
        </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/oEmX9u

### Motivating example

```llvm
define i32 @src(i32 %a, i1 %c) {
entry:
  %s = select i1 %c, i32 0, i32 4
  %shl = shl i32 %a, 4
  %or = or disjoint i32 %s, %shl
  %xor = xor i32 %or, 4
  ret i32 %xor
}
```

can be folded to

```llvm
define i32 @tgt(i32 %a, i1 %c) {
entry:
  %s = select i1 %c, i32 4, i32 0
 %shl = shl i32 %a, 4
  %or = or disjoint i32 %s, %shl
  ret i32 %or
}
```
Since `or disjoint` here can be regarded as `xor`, `((select C1, C2) | A) ^ C3` can be `(select C1, C2) ^ C3 ^ A)` and then we get `(select C1^C3, C2^C3) | A)`.

### Real-world motivation

This snippet of IR is derived from [zstd/lib/compress/zstd_compress_literals.c@ZSTD_compressRleLiteralsBlock](https://github.com/facebook/zstd/blob/1a860c8737f42b60e4e80b70d987df8583c977b8/lib/compress/zstd_compress_literals.c#L213) (after O3 pipeline).
The example above is a reduced version. If you're interested in the original suboptimal IR and optimal IR, contact me to get them, please.

**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/eJy0VV1v4ygU_TXk5aoRuf7MQx7apJEqdbRSZx5G-zLC5jpmisECkn78-hXYbdLZ0a4q7UqWAXPOueZwLwjv1cEQbVhxw4rdQhxDb93m-7Z_WTRWvmyutToRwuis7Vh2DX0Io2fZNcM9w71Is0utT8PSugPDfUsM968M9_Z2-L4-Mr5j_Hp-YzY98MUGdRJBmQPQsxhGTR9wJZ-eKDt9ktQpQ6AyBJZz71qGdRpgIRhuQa1it2W4BlbdTBwywb3EP00jiAAPLNuBJ01tOHO2SZe_dfJLQq8nSq_hMt4lxroEsQ6k8j-tMuEN6iN0UrnAP8-E2M5A6z6IOnqXeLZuNqXa_eLOpWWtMNAQdFZLkhDsp-wMh_Df25mffZ0I_4ebF0b9m09flWkJWMkvlFnJoSdHMNvn6CBcNFD4iIzelyktUlMzrOe1blfx6xYng7ZwnTrFLWyzqDnLTazfURIyNZEZKcJICD0ZeCI4UPgbt7jdZrPA1D0HZiVf_r7MHkjoqyfrtIRhrjhrLqHfeuXBGzWOFMB2cPcAyoMkp04koXN2AFbcvPogGe61amJ922F05H2sch_kj7fxD60COaH9smU5__Prt9371IOm-3nyRtv2kRU7hvXHg-SgQn9slq0dGO470VJj7eMcg-G-0TYGX4m65G1dZVWXY1NyyqnmTcXluq5kVxd11q6rqqk_9beY3eNqchRr0QVy8EcGoxpJK0MM18s3s-jttALR2BNFrwQ4kseWJJzIeWXNEu46eLFHhpUjUCaQIx9IgjJxg8E6dVBGaPDHxo5BDUJH2-P-n4dxp1trgmgDDATBppwIPQ1xZtQkPP2y5_G5pwR_NPYJVPqLlIqtNZ1yA4ReBFCBYeVBmCmcek1JAXYcrQtHo8JLDBF6YR79cpJdyE0m19laLGizqnjJ63Kd80W_KYq6w67mNScs4-dVh01XrITMV2WTdwu1QY45X2HO1xyRL1HmPBMVz7HmWImO5ZwGofT7DbJQ3h9pU62xLBdaNKR9upoQDT1BmmSI8aZym8i5ao4Hz3KulQ_-rBJU0OlOuzM-bO3QxJ0sdvBFeU_yw9LjpRbPzc8WebCfLNLF0enNP2R9Op6n5mp09ie1geE-LTnmb7LkrwAAAP__Gzc19w">