[LLVMdev] Why can't atomic loads and stores handle floats?

Philip Reames listmail at philipreames.com
Sat May 24 14:17:08 PDT 2014


Looking through the documentation, I discovered that atomic loads and 
stores are only supported for integer types.  Can anyone provide some 
background on this?  Why is this true?

Currently, given code:
std::atomic<float> aFloat;
void foo() {
   float f = atomic_load(&aFloat);
   ..
}

Clang generates code like:||
%"struct.std::atomic.2" = type { float }
@aFloat = global %"struct.std::atomic.2" zeroinitializer, align 4

define void @foo() {
   %1 = load atomic i32* bitcast (%"struct.std::atomic.2"* @aFloat to 
i32*) seq_cst, align 4
   %2 = bitcast i32 %1 to float
   ...
}

This seems less than ideal.  I would expect that we might have to 
desugar floats into integer & cast operations in the backend, but why is 
this imposed on the frontend?

More generally, is there anyone who is knowledgeable and/or working on 
atomics and synchronization in LLVM?  I've got a number of questions 
w.r.t. semantics and have found a number of what I believe to be missed 
optimizations.  I'm happy to file the later, but I'd like to talk them 
over with a knowledgeable party first.

Philip
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20140524/d69780f9/attachment.html>


More information about the llvm-dev mailing list