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

    <tr>
        <th>Summary</th>
        <td>
            clang-12 misoptimize the 40bit bitfield
        </td>
    </tr>

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

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

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

<pre>
    the code:
```
struct foo
{
  unsigned long long b:40;
} x;

extern void abort (void);

void test1(unsigned long long res)
{
  /* Build a rotate expression on a 40 bit argument.  */
  if ((x.b<<8) + (x.b>>32) != res)
    abort ();
}

int main()
{
  x.b = 0x0100000001;
  test1(0x0000000101);
  x.b = 0x0100000000;
  test1(0x0000000001);
  return 0;
}
```

compile it with gcc:
```
$ gcc a.c -o a.out && ./a.out
```

compile it with clang-12
```
$ clang-12 a.c -o a.out && ./a.out
[1]    2736023 abort (core dumped)  ./a.out
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyVU9uS2yAM_Rr8olkPBjuJH_yQNN3_wEAcOsR4uOym-_UVzm2TSTqtR8YWEufogOid-t3FvQbplCZ8TeiW0DVZ0LPNbog-yQg7587h5eb0A5DGYIZRK7BuHE5DjzA1JXxzSd7C8ebNoz5G7Uf4cEaB6J2PQNgqe4S1D6lzTtQhVpjyhM3rkBc91kXYO2Fr2CRjkQK8iyJq0McJ84NxI6AJqCn0JoLwQzroMZZ53TovPaOYXS4M7Viiqh9o6LQ4t4HL5E80zk6zFeHbu4IAn6u-O23L7XeRZoxwEGY8Zz2KQSLI0PRIK3p6qisUXHcHw-cghr-RPQWgfwOgjwBex4QHRp8IuG-V0yjdYTJWA-7tp4l7GKR81VuE1TkMopTw5vDjUt6tBRqUeBTzxH9QSSvG4a1iL8kuCf_E2Gwq0mzzMbIlX1DGb8cpndeg0mHSuWvhZbGF6rhqeSuKaKLV3ZX_YIKbojmYLw35BtY09yK-O6OtKpK33T7GKeSdy938PqC-1JeoGB1rPy6ft8m7X1pGdE0IKfffe1OzVVvsO75qdCv0akEF7xfNYqdwbEQl6-WyFrUqrOi1DR0qJYyN-hNmCPxH3YXpGGWMctpSzjhrypVc8rbvZa2UVi02fE01Nq4tcx2l80Phu7mkPg0Bg9aEGG5BEeb7q2c6xBcp7p3vvo4yGTcVM3U3l_4HEqRBDg">