[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