[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