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