<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/223249>223249</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[InstCombine] Fold equality with self-dependent select to constant set membership
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
mariiakrasniuk
</td>
</tr>
</table>
<pre>
## Description
InstCombine appears to miss:
```text
X == select(X >s 0, C1, C2)
->
(X == C1) || (X == C2)
```
when C1 >s 0 and C2 <=s 0.
Example:
define i1 @src(i32 %x) {
%cond = icmp sgt i32 %x, 0
%s = select i1 %cond, i32 2, i32 0
%r = icmp eq i32 %x, %s
ret i1 %r
}
define i1 @tgt(i32 %x) {
%a = icmp eq i32 %x, 0
%b = icmp eq i32 %x, 2
%r = or i1 %a, %b
ret i1 %r
}
Alive2: https://alive2.llvm.org/ce/z/LMpt7A
Generalized Alive2 proof: https://alive2.llvm.org/ce/z/ZMrWVm
The source is true exactly for X = 0 or X = 2, so the select can be replaced by a constant set-membership check.
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJyUlE-PszYQxj_NcBklMuMkhAOHvGSpKvW9VW3VmzFDcBcwr23236evMNmkkbqVKkUB4Wee-c2MbeW9uYzMBey_wf6cqDl01hWDcsaoZ6f8aObnpLbNewEkgSSe2WtnpmDsCOIE4vTz6ENph9qMjGqaWDmPweJgvAd5WjVwEOsv8FsAcfoDQZ5BntFzzzoAHZcvTx4FUIllGv8JKAdxQtyAfFpMVlWMWyQ5QlZCVuLDwjXqlhHE6bXjEcv0mgHV2GBJCLIEefYotivj05sapp5vzA23S0kmRdgJ7zTQ0UhCoP3bmvtbhAPaazs2S340epjQXwLehSWKT5nHe8XRdo1cNIuePl9uAe5uyj8ePBe3qHL8aeUW6uz8L-zhEr5mV1_muGHUX0rokdS6K4u6Mtb_xXjqzQsTyBN2IUxxr1AFVKn4fdv3L8PWugtQpRmo-gCqfvk-hew6np94ZKd688ENrlY4OWvb_2X453f3-2_Davhrx-jt7DSj8RjczMhvSof-HVvrMO4wFHh7jfPyFsMStw5VqxFrRsdTrzQ3WL-jQm1HH9QY0HPYDDzU7HxnJtQd6-dt0hSyyWWuEi7S7JjLVFCWJl2hmlYcDnW9b7XI0-ZwOGZHvdN5WmfMqdaJKUjQQeSpTHcy26fbQ3aUOeVtXqd52jYt7AQPyvS3yhPj_cwFkaRdnvSq5t7Hg0808ivGVSBa7gFXLEGber542Ine-ODvNsGEPt4Y_zj6sD9jZfsG-cesehPe8dWEbmlMu2l44rHh2ILYp2AfuoL3riSz64vH8V1M6OZ6q-0AVC0M18dmcvaveHlUkdwDVdfSXgr6OwAA___oXGdl">