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

    <tr>
        <th>Summary</th>
        <td>
            Clang does not optimize trivial case with bit operations
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

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

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

<pre>
    https://godbolt.org/z/5e3eKqPqs

```C

#include <stdint.h>

int firewall3(const uint8_t *restrict data) {
    const uint32_t src = *((const uint32_t *)data);

    if ((src & 0xFFFF0000) == 0x11220000) return 1;
    if ((src & 0xFFFFFF00) == 0x11223300) return 1;

    return 0;
}

int firewall4(const uint8_t *restrict data) {
    const uint32_t src = *((const uint32_t *)data);

    if ((src & 0xFFFFFF00) == 0x11223300) return 1;
    if ((src & 0xFFFF0000) == 0x11220000) return 1;

    return 0;
}
```

```asm
firewall3:                              # @firewall3
        mov     eax, dword ptr [rdi]
        mov     ecx, eax
        and     ecx, -65536
        cmp     ecx, 287440896
 sete    cl
        and     eax, -256
        cmp     eax, 287453952
        sete    al
        or      al, cl
        movzx eax, al
        ret
firewall4:                              # @firewall4
        mov     eax, dword ptr [rdi]
        mov     ecx, eax
        and     ecx, -256
        cmp     ecx, 287453952
 sete    cl
        and     eax, -65536
        cmp     eax, 287440896
        sete    al
        or      al, cl
        movzx eax, al
        ret
```

GCC:

```asm
firewall3:
 movl    (%rdi), %eax
        xorw    %ax, %ax
        cmpl $287440896, %eax
        sete    %al
        movzbl  %al, %eax
 ret
```
GCC can optimize such comparisons, but it failed to optimize `firewall4` https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108215

Clang can not optimize both functions.


</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzMlsGOozgTx5_GuVgdmTImcODQnXzM4bvsG7SM7YB3Dc7YJsn2068MSZNkwqhHWo0WRSFyVf1c_v9NMPdeN71SJWJviO1WfAitdaW34i8VDly7VW3l32UbwsEj-oqgQlA1VtbWhLV1DYLqA0HFFFX___7Hd4_IDpHXy3dGps_2bhSo7oUZpMKIbn2Qug_rFtH_3SbpPuC9durEjaEIcmF7H_Cg-5C_B4zg1SkfnBYBSx44ggKjzdtUijHGczqF94C9ExjRXaxDkN_hxvg4XlxIiL7ddhJxeo-nuhEEGSbnqqoqQggZp6a7SCfnJAG4DjoVBtfj5BP3E1BE_QCidAE04y4hMoc2uyUV0_-qir-2-H_Nji-peN3AT3c19900Mm9UOgKXLwQUo5TMBZ9NxKuzx_Gu-BnBFsuTdRIfgsOIvTmpEdst5IsxP5bdxXkvb-MvGWM0u08R3eE2BfJNmpK8uGZ5FdSYZhbIU6cvwJa4_JPLaMHgPuuK5w946y7TmFj8OHlnjx_nK_mx1Klwb0r6q6akv9eUZenEU-m-asnPzOZPzf4Npjx9oL5tt_HN8uVH7MLu7NFM9uUIWLQCijg5AvaD6GfrTlMumzqcfjyqYzCCdJZlAXYVKDKeqFCba-ixfkmGb9stFrzH9hB0pz8U9oNosbDdgTvtbe8jqR4C1gHvuTZK4mDnbJTd7N2M4Id3tRDrph8u7-p6aD60MRxB5Vt7eq-HZi0ajWilJaK7hOSQsFsrtob3zdhdb8M8Z21Di_dDL4K2vV_fVqxkSWVBC75SZZJtkhySLIdVW-aSp7WUZEM4TXPK6jSXeS2KPaeFSrha6RIIQPz3T3KWprCuGU0LtuGFELUsFEEpUR3XZm3MsYsrWmnvB1WyIsvJyvBaGT8eZAB6dcJjEAHEc40rY81LPTQepcRoH_xMCToYVU5LlVb5-7UGp4-aGyy4V_ikQ4trHcPK8XH1q8GZxwOSDu1Qr4XtEFRxmsvt5eDsn0oEBNXYnI9Hp9j8PwEAAP__z8KHLA">