<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/83586>83586</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[x86] Consider not optimizing away `andn` when it can save a `mov` instruction
</td>
</tr>
<tr>
<th>Labels</th>
<td>
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
Validark
</td>
</tr>
</table>
<pre>
This code:
```c
#include <stdint.h>
uint64_t select(uint64_t a, uint64_t x, uint64_t y) {
return (a & x) | (~a & y);
}
```
Currently gives this on x86:
```asm
select: # @select
mov rax, rsi
xor rax, rdx
and rax, rdi
xor rax, rdx
ret
```
Alternatively, this could be:
```asm
select:
and rsi, rdi
andn rax, rdi, rdx
or rax, rsi
ret
```
`andn` helps us eliminate a `mov`, in this particular case. Would it be possible to take this effect into consideration when deciding whether to apply this optimization? Should it be taken into consideration?
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyMlM-O4zYMxp9GvhAbOJL_HnyYzTQv0KI9FrLFxOzKkiHR2UkPffZCjmeadGbaDYIYJPVZ349UpGOks0PsRPlVlM-ZXnj0oftVWzI6fMt6b67dLyNFGLxBoZ5E_izy198qv32HLZaK3GAXgyDUIbIhx7tRqJ_uRQs5rorfGSJaHFjI5i2jhTzAW_TyEF2FbEHUX28vAQAIyEtwIGSjQcgqrU8rDinz1y2VREJtGlE__8v2va3DEgI6tlc40wUjcGL2Dl6a6jNqHadbZiNRTyCkAlHkW-LNavpM_rI-g17BQqSt_uLDQ8G8PAq1M491eqz_nz4g_wf3k2UMTjNd0F6Tnm_DXqyB_tOBv0f_xHOkDz1rZ9w90Ee-N6z3DfshrmTSGSeqHEa0c4QlAlqayGlG0CCqfPKXJJIHIHfDnnVgGharAww64g5-W_tADD3C7GOk3iKwB9bf8CbB0wkHBnLsYfAuksGgmbyD7yM6MDiQIXdOEY8YkljPs71uB2xmmujPVSDUEX4e7zZMm7gP3izUMTOdMq1qdYbdvs5blTfVvs3Gri-aoqiassa66bGRTVX3tVRtpcu8b_d1Rp3MZZGrfL8vy6psd8Vw6nNzkqoohkKd9qLIcdJkd9Zepp0P54xiXLBrVNlUmdU92vh6W4QuLfrSL-coitxS5PiPjInteq-kv1D5DIeNAZznV_DUGf1dX-FuXGvfiGHQDqK-PAwLyEUOy5DakC3BdiPzHNPxk0chj2ficel3g5-EPCYj2-PLHPwf62VzXGGikMeV5-8AAAD__268dXc">