<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">