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

    <tr>
        <th>Summary</th>
        <td>
            Clang fails to fold bitwise and with constant and load
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            clang
      </td>
    </tr>

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

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

<pre>
    In the following code (adapted from https://coredumped.dev/2024/09/09/what-is-the-best-pointer-tagging-method/), Clang fails to merge the `and` and the load

```c
#include <stdint.h>

typedef struct {
  uint32_t _pad[1];
  int32_t data;
} Data;

typedef struct {
  uint8_t *data;
} LowBits;

int32_t untag_bits(LowBits self) {
  uint8_t tag = (uint8_t)((uint64_t)self.data & 0b111);
  uint8_t *ptr = (uint8_t *)((uint64_t)self.data - tag);
  if (tag == 1) {
    return ((Data *)ptr)->data;
  } else {
    return 13;
 }
}

```
[Godbolt](
https://godbolt.org/#z:OYLghAFBqd5QCxAYwPYBMCmBRdBLAF1QCcAaPECAMzwBtMA7AQwFtMQByARg9KtQYEAysib0QXACx8BBAKoBnTAAUAHpwAMvAFYTStJg1AB9U8lJL6yAngGVG6AMKpaAVxYM9DgDJ4GmADl3ACNMYj0AB1QFQlsGZzcPSOjYgV9/IJZQ8K4LTCsbASECJmICBPdPXMtMazji0oJ0wJCwvQUSsoqk6s6mvxastq4ASgtUV2Jkdg4AUgAmAGY/ZDcsAGpZxccO/EEAOgQt7FmNAEFTs4IATwjMLCp1juJXa02AdgAhS/X11z8CIt5sYCOtjBEmOhZgBWT5cGEAES233OvwBQJB63QTBKyMus3eCPWCJxTDx50uNzuDyeBBebwJKLOv3%2BggAHJiAFTY3GLJkEoneVAAd0%2BhAU5Iu53RwNBrkETGAxmC4ogQtF4qe%2BSoIw%2BTJZAI5oJKwE2iyJEFZBCNIygVoAbJIQSNLFR9jymJt5vb1hpglwAyNJQb2VyInSzRarUb1pzbZaAY7na73aT1gBadYmoN8n7rPCPCAmyNbImjPV537ETAESYMdZQEklWMjcPEEbp44e4MfIn5JQV1G/dbV2vEetcRY9gX4wmXDhjWicaG8TzcXioTiOJ4TKaYL2LHikAiaBdjADWIEP%2BwAnHf3jepO8uGyb/NJPN5vpOJJV6fSJuHC8AoIAaMep5jHAsBIGgLARHQYTkJQsHwfQ4TIMAUhfjQtAEGEIEQME/4qswxDXJwR4kaU1wAPLBNotQnuupCwWwgg0QwtDkRwWikFgwSuMAjhiLQIHMVgLCGMA4g8bw%2BDVnUABumBibxmCqLUrh4f%2BAL5P%2BtB4MExDUc4WD/nSeAsBRvDKcQwTRJgCKYJJRgGUYEF8AYwAKAAangmDCjRdxrke/CCCIYjsFIMiCIoKjqLJpC6LkBjuaYxjmAZwQgZAYyoOGcRiemNGLButnEHgWA5RAYw1HUdgQA43RVKQPgDJk2TJDEhTxC4lRdakDDNB1wx5AU9R9M17T5IxE2NMNrQ5BYk19T0y3ze1i0SLVu7TNt34cCupBrrxgHrKobL2umjrrMAyDIOsUj7PMDa4IQJAHqMvBMVoIwXlekj7PawNsu80JcDekjvO8H7QvaB2/sd/6AcBoHgbJkEwIgKCoHBCFkBQEAofjKCrFJL5cGBOF4cQBFEYlVFkdZpCM7R9GMczrGMAQHFcf%2B/GCcJtCiczElSTJvHybNymqbw6madpiW6UuiVZcZZGmTMvEWVZzG2fZShOS50l%2BKAGOeYqvn%2BYFwXM2FwiiOI0X23Faj/roX6pSYZj6IZ1V5QVAhFSVZVhBVVXwLVM31Z4jUME4q0tW1GRbbkUTdXEU1pykPULUMS11T1DRdIn03jUUfR551vSNFn61lFXww7ZMe2jAdR0nRunDnZd12SOsZNGI9bL7Fw%2BwaK9%2BBEMQn0jN9EH/Ysiz7Evq9r%2BvCN/olKMWGjP1ngd8xb6dnDzxjYy2TEdiSEAA%3D)

Clang has
```asm
and     rdi, -8
mov     eax, dword ptr [rdi + 4]
```
GCC has 
```asm
mov     eax, DWORD PTR [rdi+3]
```

</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyMVlmTqjy0_TXpF6q7IIDiQz8kTIKgMojiyykmI8jUEET99bfQ_obT93y3bpWFZO3N2jubUGtFfZ-TOss-gYiBqLxFAz033aeXZV7b5TV5i5v0_mnUDD1nzKkpy2bMa8IkTZoxAEpRGrU0S5lT11TMmdK2BzwCUANQS5ouS4eqzdKPNLsCqEEWCgBq7OKvy3iO6Hvev9Nz9h5nPX1vm7ymWfdOI0LymrxXGT036ZNuAaDMyGVUE-YU5WXP0Iapso5kz8bAjI3qFMxYJqrTJ1I2UQpYBbDo-zpjX7_kew35vE7KYdoGL_c0zWv6cQa8-u-H6L3N0uzE9LQbEsqAOX7hDDPkNeXhL8r8aqMUiJgDogL4v8N_RdOIRn_DYK4wym_A_6OI9IsyAKL_RWQ1I85p_4Prr7pDTSPyK54SoPSdyvRZeQJw8acKNCIM4JXpjX5Dz4lL3-uZ8AQmgo-pEwbAGcPGHMdNafyfGm5p94NxQv9v1vepj98Z89PE8N3exMf92AHDdBkdupp58Sqv7qZCLe0AXLwDXv1teAwzjS8r--yPNBz_TyaYK38P_I9n6XspYr1J46ak0yGA0gv9_WMgr4SPpiNPgH8AHm1Ci5yRhr9S0ZFvKBy3IbblCrsptpDGOXKCoq0qI_sxYmqjOXJGjdoOviOXLFbUCVV07_OYdQ5IvkkYo1WDax-hHVq2I7KvSAt9j5qEQ3ixk0rTmt1RTfRAnyF71UYouIX2QiGKKegVUkoeyWs7LFiEOUdzyl4_PpKttylCEkxfq2EeHWklWL7cx8hTZbMyZLxNtweb2tGjyNnGZEdTHq_Ozuubr8usn1XXW9TTLwF5hO4CaF5SIqAdQRXSQwC1o5L0SG-PtyTZAKipKtoQh861ao1Uze8FA_ljYVtyyxWDeYhYiFKCzh6A2oHjHpJsULEP5Q0tsFptzkeC976Y6CpSPcjzm-uIHRPPeMfHq7s99Hwmb_eyefOVm8gO68eg3DOMs3g0V9bmygMoQkwIWpo50vyQ1y3zojZ1FiCUss_gGe1EYxB5d1zj7qL6OrpVstAQh2rCV_ZM8RpjfN745hEZYmOuRhXmd1PVjlheG3cSNCg2DcdbW5q7KO6VScVrzJ1bUo7ovjadGAZ3o_YebtTtYq59xMcIhfM6mvORzxEcpWHVrKV63m3lrYyq-zo2qmIbiPxc9ZHqhXZ6dNRLubeLZKuqcSsImWCfjFo0nYDTAdTSOIBXNaOJGy7IQRirg3Iu9nkS6ZL_SA554-cbU_BXUWhBa5lfUB7htEDK3lC3z52NqF6e-CJrN9Kg32MAtbW5XYvXdmOawezkmcNSllBjoMjOWrFYoh4bOrGQu3RC_2I6_XI8OYJv2Gh3PhUORaquGqpjqwBqwlc_3pSDObrCJdpxI9paeN1Qpx6GVh73IyGsM1Ll4o77_KKR0RtsVJxzyzGWdkAsWbeRQKT49QqUoN4hPFQ4j2-V_GXturNwekaQJb72QrFgqzdllwh7BUCt9jLUY_eqrBJn9F2TyKvQNF2i70JVk1A4ohVCUU0qRS7c9NZdMgA1WZaNsOg1w85lo1kVX5bZyjPrgoshCm9FhY6jQ44ovDcbPXHzrFrrFh5orS7JHokuCkduuUuJgwTeDVbOlijmBfqmop79myyUbhpdFGWNufEmot3CXdjc3BeNmwrX9rpzRBxeuIXP3vlHxuWsZwXD3F9TXkjkocVddyPLbtXEFhyqoutsdFeMTb8r5ltbiQTDMdHyy75iO2iM8VBml2K-jcZ1P0ismSjZpbhupOXcuUYYAqj1kxLPUIKbJYnNizoaZCU3SyxrF-yoqDkVK7nTTEtMdLzRhMTBmhqWgXZJj61sz92FbiePTreRs9SS15sAUNPlxKRynjzU0vPN6_Ier-_VVzzOqiht8_1sN-TBMTke9cq3r-o-OD50eDp6540nsuWTZIX0TRZ-XevnKtTGgw21Mc83BnuAvBYVAGpdc5i1XngsZsaRC0QnQGfNC47BGQfBYbQCm-eOQrGzVeGLpXtOd-P4svPTg7rj2vtlu7N2tsdxPqe4qVGzfLHbnVxR5K7eWqtnXKkdxnF-tDNYoNRla3eolfqYctDb9Me1bixia669TuUYrRbPG6zaTs0W64W6BFAL-_wxV69fi-4ZvMprALWmXNl7vdhyNUmlWzxLa-VxK8I79NU091SEABR5ZRLMf4nTyyOdo_6HVkV99UImh_QUvDSfPNX7t15VzfUJZ9FtgtOx6VLmqeIi7tKcARAzwiRwf5JAXZanksx_1fxBruw3rsJsffebHEDM_xf1W_rJpwt-Eb1ln9wczlhWlDj4dv5MIy6NFzEHRWEmpZK0OKWz0zybSwJ3gjMxecs_J8fJLjgWQpbn4cc8jk5ZMp_BRDqJfMwDgc2qKC8_yvJaTdL8lvf9kH1yrMSx8K2M4qzsn8YYwmQaK4Bw8sjd5_TAezyQHghsmfe0_4eC5rTMPn841VNTpkyc0zHvs6dFHXN6ZpKm7mlU0ycyGda3oSs_fxiHnJ6H-CNpKgC1qcj333vbNUWWUAC1Z9M9gNp339dP-D8BAAD__ydrmgA">