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

    <tr>
        <th>Summary</th>
        <td>
            clang treats asm volatile block as a memory barrier, no-op on gcc
        </td>
    </tr>

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

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

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

<pre>
    ```c 
int a = 0;

int main(void)
{
        a = 1;
        asm volatile ("");
        a = 2;
        return a;
}
```
gcc only generates one store, `a = 2;`, while clang keeps both. clang seems to treat `asm volatile("");` as a memory barrier, gcc doesn't. afaik, `asm volatile("" ::: "memory");` is the only thing that works on gcc.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJx0UttuozAQ_RrzMioyQzDhgYd2o_yHMRPwxtiRPaTK36-4tGm3u8gScDw-N1mnZAdP1IrqTVSnTM88htiaGFKvR5d1oX-0QsltGRDyJOSr9QwaRHkCKcq3DXvuTNp6gcd7sL3AZt-t9zHYn-148Xn8E08T3IPTbB2BwKNAXFfzc3JlwB94JJ6jB_10Vp_2j48c2-9gDATvHjCQp6iZEgRPkDhEEvgLhJJfNJRcsPdx8WWc9gNciW4JusBjviOJaErAATiS5pXgS5y_0ygJOoGGiaYQH9DpGC3FRWVx1gdKXmDNOeiLttcPR_8iBFG-bgsE4sb3Tccm4JG2tDxaPwCPmuE9xOsSehHMs74t-6ZsdEZtUcuyKqtGVtnY9tjogqS5oLrUtVGyPphKHaWS6lB3PWa2RYllgVihxEpWedXXWPRSysLUqjsqcZA0aety5-5THuKQ2ZRmamtVqiZzuiOX1huIuBa5eK9OWWyX-ZduHpI4SGcTpycDW3bUbr2vdafvd6dzwVz_V7APL-G2B8_m6NqR-ZaWCvEs8DxYHucuN2ESeF4U99fLLYbfZFjgeQ2QBJ7XDH8CAAD__3Zy9MU">