[llvm-dev] @llvm.memcpy not honoring volatile?

Guillaume Chatelet via llvm-dev llvm-dev at lists.llvm.org
Fri Jun 7 01:38:33 PDT 2019

On Thu, Jun 6, 2019 at 8:24 PM Eli Friedman <efriedma at quicinc.com> wrote:

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

Thx. I guess my next question is, from the code gen perspective is there a
difference between the volatile and non volatile versions
> void f(volatile struct S*p) { p[0] = p[1]; }
> void f(struct S*p) { p[0] = p[1]; }

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."
I tried x86_64 gcc, x86_64 clang, ARM gcc, they all generate the exact same

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20190607/8e54f2d0/attachment.html>

More information about the llvm-dev mailing list