<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/83637>83637</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Machines lacking AND-NOT should transform `(a & x) | (~a & y)` -> `(a & (x ^ y)) ^ y`
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
Validark
</td>
</tr>
</table>
<pre>
Machines lacking an AND-NOT instruction should transform `select` into `select2`. [Godbolt link](https://godbolt.org/z/8oaGqqzbn)
```c
#include <stdint.h>
uint64_t select(uint64_t a, uint64_t x, uint64_t y) {
return (a & x) | (~a & y);
}
uint64_t select2(uint64_t a, uint64_t x, uint64_t y) {
return (a & (x ^ y)) ^ y;
}
```
RISC-V emit:
```asm
select: # @select
and a1, a1, a0
not a0, a0
and a0, a0, a2
or a0, a0, a1
ret
select2: # @select2
xor a1, a1, a2
and a0, a0, a1
xor a0, a0, a2
ret
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJycVE1v2zAM_TX0RUigUJY_Dj60SVPssA7Yhl4H2dZirYrUSvLW9rDfPsh20rppu2FCoJjkI_Wojye8VzsjZQX8HPgmEX3orKuuhVatcDdJbduH6qNoOmWkJ1o0N8rsiDDk7GqzuPr0lSjjg-uboKwhvrO9bklwwvjv1u0JZNRLLZsAGSXKBPvkQcjokgA_v7RtbXUgWpkb4BvAogvh1gM7A9wCbndjfGndDnD7CLgtrLi8u3usDWAJdAP0bJozOv6ayUamTKP7VhJgax9aZcKyA3bxPKlXJmTpt0AmolgcPQJwTY7W_cx6ACwJ5OdjEeJk6J0hgIUggFkEx_A6en6PrpgBbEqAfPMOCfxPFoScEAEs7gnwi3H5iB6-T3kc9u45rc8fvqwX10TuVYjHMQcKvx8908axYf13ByAjkB6uxMhZmHaIiVXsbJrpU0NxGBtGDH0teqxwiMYZ5xjryClmNcc4GZ43hLGjGeMXNe-nojPm-A_cVm_UeYf_kdur55S0FWtLVopEVquclowVnLOkq3DVMJFnJa9pi03KqeC5LLlgTS5y3haJqpBiShlFSlecsyWvaSazukjTgtVYI6RU7oXSS61_7uMbTJT3vawKlrE80aKW2g_agWjkLzIEATFKiatizqLudx5SqpUP_qlKUEHLU2E5qMprSvLXx5VRsgB2McO-cf8zmvROVy-URoWur5eN3QNuI9Ppb3Hr7I9BG7ZDfz5qUOz_TwAAAP__1fZn1A">