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

    <tr>
        <th>Summary</th>
        <td>
            [AArch64] Unnecessary materialisation of `0xDF` for `and`
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            backend:AArch64,
            missed-optimization
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          Kmeakin
      </td>
    </tr>
</table>

<pre>
    LLVM generates an unnecessary `mov` in `and_cmp`, but in all the other variants it is smart enough to emit the `0xDF` directly as an immediate argument in `and`: https://godbolt.org/z/xPfc5rh9c

```c
#include <stdbool.h>
#include <stdint.h>

typedef uint8_t u8;

bool and_cmp(u8 b) { return (b & 0xDF) >= 'A'; }
bool load_and_cmp(u8 *b) { return (*b & 0xDF) >= 'A'; }

u8 and (u8 b) { return b & 0xDF; }
u8 load_and(u8 *b) { return *b & 0xDF; }
```

```asm
and_cmp: // @and_cmp
        mov     w8, #223 // =0xdf
        and     w8, w0, w8
        cmp     w8, #64
        cset    w0, hi
        ret
load_and_cmp: // @load_and_cmp
        ldrb    w8, [x0]
        and     w8, w8, #0xffffffdf
        cmp     w8, #64
        cset    w0, hi
 ret
and:                                    // @and
        and w0, w0, #0xffffffdf
        ret
load_and: // @load_and
        ldrb    w8, [x0]
        and     w0, w8, #0xffffffdf
        ret
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJykVU2PozgQ_TXFpdSRUw7EHDiQZnLZWWkvu9eWgSJ4B3Bkm3R6fv0K0kmHnp7e0S6KjFIfr-q9sgrtvTkMzBnEO4iLSI-htS77rWf9zQxRaeuX7OvXv37HAw_sdGCPesBxGLhi77V7QUhEb0-QCDTD9EcP9VPVHyERQI9YjmGy667D0DLa0LLDk3ZGD8GjCWg8-l67gDzY8dBisMi9CXM0JEKci_2EXRvHVeheUM8NmL7n2ujAqN1h7HkIb9WnyjLHNoSjB5kD7YH2B1uXtgsr6w5A--9A-_MfTRW7Nq1AFCDy1zMRl9_VStIMVTfWjCAffahLa7tVC_LLT_xmCPfu-QwvR665wdEMQT0FHBXI3X3ABIpX3UiNCkugFGG7Q8dhdAMCqRKBEpz1mHzyC8gCgbY50BbkDmFb3KF1VtdPC0ig_APUyfqrwJdzVFOr-HGfd1j3maO6NfRJM_lPsm9D-XBS2vcXy5WtzPEyc4TN7TbOEfj69PY0v5_VdEWBJJG85chCnOtmmTARfkt4nm_2s1rGVP1xCZps3gV4DnPAnN6apddxuBgWk1twWXgWyV3tyrva8e4sIC4-5XDtUpyb-XlP-b_SufGYZi1v0Z89i2n92PSr3OJfGv5BwI_F-x_CiV8S7tbH7YZGdSbrVKY64my9JZEqGadp1GaNElWZVjphEddiS7WKuYlVKkpOE16ryGQkaCO2681axWmcrrhOUtKKKG2kWFcpbAT32nSrrjv103KLjPcjZ6lSch11uuTOz6udqNTVN55VyXNXtckGiIAegag33nP9YI_B9Oa7DsYOky8uIpdNuA_lePCThMYH_1YpmNDN340rXlzgn3cfhl4HdkZ3xs-QaJv7hd5Y97avo9F12buFbUI7lqvK9kD7qebr6-Ho7N9cBaD9TNUD7S9sTxn9EwAA__-VEtsp">