<div dir="ltr"><div dir="ltr">On Thu, Jun 6, 2019 at 8:24 PM Eli Friedman <<a href="mailto:efriedma@quicinc.com">efriedma@quicinc.com</a>> wrote:<br></div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">





<div lang="EN-US">
<div class="gmail-m_-1025683056797698224WordSection1">
<p class="MsoNormal">clang uses a volatile memcpy for struct assignment in C. For example, “void f(volatile struct S*p) { p[0] = p[1]; }”.  It’s not really that useful, but it’s been done that way since before clang was written.<br></p></div></div></blockquote><div><br></div><div>Thx. I guess my next question is, from the code gen perspective is there a difference between the volatile and non volatile versions</div><div>> void f(volatile struct S*p) { p[0] = p[1]; }<br></div><div>and</div><div>> void f(struct S*p) { p[0] = p[1]; }</div><div><br></div><div>Clang could lower the volatile copy to a regular copy. And since memcpy has side effects it would still maintain "that volatile operations are emitted in source order relative to other volatile operations."</div><div>I tried x86_64 gcc, x86_64 clang, ARM gcc, they all generate the exact same code.</div><div></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div lang="EN-US"><div class="gmail-m_-1025683056797698224WordSection1"><div style="border-top:none;border-right:none;border-bottom:none;border-left:1.5pt solid blue;padding:0in 0in 0in 4pt"><div><blockquote style="border-top:none;border-right:none;border-bottom:none;border-left:1pt solid rgb(204,204,204);padding:0in 0in 0in 6pt;margin-left:4.8pt;margin-right:0in">
</blockquote>
</div>
</div>
</div>
</div>

</blockquote></div></div>