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

    <tr>
        <th>Summary</th>
        <td>
            Toggling an atomic_bool with ^= is inefficient
        </td>
    </tr>

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

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

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

<pre>
    Consider this C code:
```c
#include <stdatomic.h>

atomic_bool b;
atomic_char c;
_Bool b2;

void f1(void) {
    b ^= 1;
}

void f2(void) {
    atomic_fetch_xor(&b, 1);
}

void f3(void) {
    c ^= 1;
}

void f4(void) {
    atomic_fetch_xor(&c, 1);
}

void f5(void) {
    b2 ^= 1;
}
```
At `-O3`, those functions compile into this:
```asm
f1:                                     # @f1
        movb    b(%rip), %al
.LBB0_1:                                # =>This Inner Loop Header: Depth=1
        andb    $1, %al
        movl    %eax, %ecx
        xorb    $1, %cl
        lock            cmpxchgb        %cl, b(%rip)
        jne     .LBB0_1
        retq
f2:                                     # @f2
        lock            xorb    $1, b(%rip)
        retq
f3:                                     # @f3
        lock            xorb    $1, c(%rip)
        retq
f4:                                     # @f4
        lock            xorb    $1, c(%rip)
        retq
f5:                                     # @f5
        xorb    $1, b2(%rip)
        retq
```
The code generated for `f1` is inefficient. It should have generated the same code as it did for `f2`.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy1lU2PmzAQhn-NuViLiI1DOHDYhK260kq97D0ytgPeGkyxSdN_3wGSzccqaXKohcAf49ePPeOhsPJPtrKN01J12Ffa4RUWVipEn1GUo-gZzaPpEfs2oboRppcKI7pyXnJvay3CCtGXvcX4nrrXhbUGF4guz3pFxTssPnvXy9GKfHZM763VEm9miCyGGiIpRsneAEMpMGIviOZ4dpyX5F8FyDWBPcxGeVGtd7YDO0TmBSIrkCTpbVV6TVXciRU_hiXuw2JXT4vc4jo4eWo-ewz1px906IFlfWWdwpu-EV5DrECA1K02CuvG2zFovkYLd_XUA_6jI8A_C0QWRnEEEz6hh1LbbTFuYDwH1ul2OASgggY3k234tlxG63tWGhehOQTr-xDsr00Dcf9mbYu_Kw53YJDIVeshnPMLEN7IYpKIZxfrn7CayYQpvtsbKbE7twKfXgqJCyFjxc9TbFG3O1GVxXEbwxSYe34qZxofjRq_h8M5G-yU_7V3EHnUQeQ26-X2biCeUNBHKehjFOIuivhRivh_ULBHKdjtACvIPcteJIH3So1_AlwquCPcK8guthsSA9zQeYTh9uhGbTZaaNX4EL967CrbG4krvj2d5UHI8XqvxmGax1If1Qi8wkBmVKY05YHX3qjs3Zal0U0Jtw6f_kp-a18dEtk5QdB3Jqu8b8dsRL7BU4JxX4SQrqBhzPbweWo7-6GEh6Z2rlcOKoylsySoMiIWCWdpOk_EImUpjYWcx5FKgW0mRSICwwtlXIbYErE80BmJCInmUTKLGRiGKeOsIHQhZRoljMfgHlVzbcJh4dB2ZdBlI0PRlw4GjXbeHQe5c7pslDro8x6Sb5d9QAJuK-F0YVQwMmcj8F9xmfV4">