[LLVMdev] Is it correct to access non-atomic variables using atomic operations?

Lei Zhao leizhao833 at gmail.com
Sun Aug 5 10:30:17 PDT 2012


Thanks a lot for the detailed explanation. There is no particular reason that I want to do this way. The question just comes when I am trying to get to understand the usage of C/C++11 atomics. 

- Lei

On Aug 3, 2012, at 7:24 PM, Jeffrey Yasskin wrote:

> On Sat, Aug 4, 2012 at 12:11 AM, Lei Zhao <leizhao833 at gmail.com> wrote:
>> Hi Everyone,
>> 
>>  This might be more a C/C++11 question than a LLVM question: I wondering if it is semantically correct to access an ordinary variable via atomic operations, like:
>> 
>> int val;
>> void foo(){ atomic_store((atomic_int *)(&val), 42); }
>> 
>>  I tried this simple program on clang+llvm and 42 seems to be correctly stored to val. But, is this just by luck or a right way to go?
> 
> Like with nearly all type punning, alias analysis is likely to eat
> your program if you do this.
> 
> In LLVM itself, atomic operations are simply a different kind of
> operation on ordinary addresses. Running an atomic operation and a
> non-atomic operation on the same address concurrently, where at least
> one of the operations is a write, is a data race, which gives 'undef'
> results, but as long as you separate your non-atomic operations from
> other operations with happens-before edges, you'll be fine:
> http://llvm.org/docs/LangRef.html#memmodel.
> 
> I don't think Clang exposes any way to get at the raw LLVM operations
> from C++, which I think is probably the right design. Why do you think
> you want to access an ordinary variable with atomic operations instead
> of just defining atomic variables?
> 
> Jeffrey





More information about the llvm-dev mailing list