@nabijaczleweli x87 is broken and the ABI did change for returns of unions with long double. :). I should note GCC policy on using floating point inside the compiler is that it is banned (there are a few open bugs about removing the places where it is used). I wonder why LLVM decided to use the floating point.
also did you know that "the ABI of passing union with ‘long double’ has changed in GCC 4.4" (the function in question does not take a long double argument)
tracking a bizarre what-seems-like-mis deduction and I default to Clang so rebuilding with GCC naturally gave me 4 spurious maybe-uninitialised and control-reaches-end-of-non-void warnings