Ah you're right it is guaranteed by c99 and newer (who cares about c++ :-)).
I was probably remembering some discussion for older c standards, where it might not have been guaranteed by the standard but all compilers would have honored the union aliasing anyway. But in any case I'm still fine with using a memcpy - the linked article even mentions gcc generates the same code. Roland Am 29.07.2016 um 15:42 schrieb Gustaw Smolarczyk: > Is that really the case? I always thought that using union is one of > the best ways to play it safe while not disabling strict aliasing > rules. > > Here is an answer on stack overflow that uses this reasoning: > https://urldefense.proofpoint.com/v2/url?u=http-3A__stackoverflow.com_a_99010&d=CwIFaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r=Vjtt0vs_iqoI31UfJxBl7yv9I2FeiaeAYgMTLKRBc_I&m=yFSuLWBBbLWZDrPaxDVOCjO0cX88sn16LdG-wdamPNQ&s=Ay0ZWq7VAYWw11SblOvtJSj9jhhARSxr13nrT-y8iik&e= > > > Here is another site with an extract from C11 standard: > https://urldefense.proofpoint.com/v2/url?u=http-3A__dbp-2Dconsulting.com_tutorials_StrictAliasing.html&d=CwIFaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r=Vjtt0vs_iqoI31UfJxBl7yv9I2FeiaeAYgMTLKRBc_I&m=yFSuLWBBbLWZDrPaxDVOCjO0cX88sn16LdG-wdamPNQ&s=vIzvE6OQ57S1mnD6755iC9AOD57xXqJKUGtsk_DKBhs&e= > > > Look especially at footnote 85 of 6.5.2.3. > > Regards, > Gustaw Smolarczyk > > 2016-07-29 15:22 GMT+02:00 Roland Scheidegger <srol...@vmware.com>: >> Am 29.07.2016 um 06:55 schrieb Connor Abbott: >>> On Thu, Jul 28, 2016 at 7:58 PM, Roland Scheidegger <srol...@vmware.com> >>> wrote: >>>> Am 29.07.2016 um 00:35 schrieb Matt Turner: >>>>> --- >>>>> src/gallium/auxiliary/Makefile.sources | 1 + >>>>> src/gallium/auxiliary/util/u_bitcast.h | 57 >>>>> ++++++++++++++++++++++++++++++++++ >>>>> 2 files changed, 58 insertions(+) >>>>> create mode 100644 src/gallium/auxiliary/util/u_bitcast.h >>>>> >>>>> diff --git a/src/gallium/auxiliary/Makefile.sources >>>>> b/src/gallium/auxiliary/Makefile.sources >>>>> index e0311bf..26f7eee 100644 >>>>> --- a/src/gallium/auxiliary/Makefile.sources >>>>> +++ b/src/gallium/auxiliary/Makefile.sources >>>>> @@ -175,6 +175,7 @@ C_SOURCES := \ >>>>> translate/translate_generic.c \ >>>>> translate/translate_sse.c \ >>>>> util/dbghelp.h \ >>>>> + util/u_bitcast.h \ >>>>> util/u_bitmask.c \ >>>>> util/u_bitmask.h \ >>>>> util/u_blend.h \ >>>>> diff --git a/src/gallium/auxiliary/util/u_bitcast.h >>>>> b/src/gallium/auxiliary/util/u_bitcast.h >>>>> new file mode 100644 >>>>> index 0000000..b1f9938 >>>>> --- /dev/null >>>>> +++ b/src/gallium/auxiliary/util/u_bitcast.h >>>>> @@ -0,0 +1,57 @@ >>>>> +/************************************************************************** >>>>> + * >>>>> + * Copyright © 2016 Intel Corporation >>>>> + * All Rights Reserved. >>>>> + * >>>>> + * Permission is hereby granted, free of charge, to any person obtaining >>>>> a >>>>> + * copy of this software and associated documentation files (the >>>>> + * "Software"), to deal in the Software without restriction, including >>>>> + * without limitation the rights to use, copy, modify, merge, publish, >>>>> + * distribute, sub license, and/or sell copies of the Software, and to >>>>> + * permit persons to whom the Software is furnished to do so, subject to >>>>> + * the following conditions: >>>>> + * >>>>> + * The above copyright notice and this permission notice (including the >>>>> + * next paragraph) shall be included in all copies or substantial >>>>> portions >>>>> + * of the Software. >>>>> + * >>>>> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, >>>>> EXPRESS >>>>> + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF >>>>> + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND >>>>> NON-INFRINGEMENT. >>>>> + * IN NO EVENT SHALL THE AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR >>>>> + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF >>>>> CONTRACT, >>>>> + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE >>>>> + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. >>>>> + * >>>>> + >>>>> **************************************************************************/ >>>>> + >>>>> +#ifndef U_BITCAST_H_ >>>>> +#define U_BITCAST_H_ >>>>> + >>>>> +#include <string.h> >>>>> + >>>>> +#ifdef __cplusplus >>>>> +extern "C" { >>>>> +#endif >>>>> + >>>>> +static inline unsigned >>>>> +u_bitcast_f2u(float f) >>>>> +{ >>>>> + unsigned u; >>>>> + memcpy(&u, &f, sizeof(u)); >>>>> + return u; >>>>> +} >>>>> + >>>>> +static inline float >>>>> +u_bitcast_u2f(unsigned u) >>>>> +{ >>>>> + float f; >>>>> + memcpy(&f, &u, sizeof(f)); >>>>> + return f; >>>>> +} >>>>> + >>>>> +#ifdef __cplusplus >>>>> +} >>>>> +#endif >>>>> + >>>>> +#endif /* U_BITCAST_H_ */ >>>>> >>>> >>>> I think traditionally we've used the union fi from u_math.h to do this. >>>> That said, I don't have anything against using an inline memcpy helper >>>> function instead - both should hopefully get optimized away... >>> >>> Unfortunately, that won't work with the strict aliasing rules either >>> since it's undefined behavior to reinterpret a union by dereferencing >>> more than member. That is, once you assign to one field of a union, >>> you can read from/write to that field only. You can, however, >>> reinterpret anything as a char * and dereference, hence why memcopy >>> etc. aren't undefined. >>> >> >> That might be technically true, but I'm pretty sure it's not in >> practice. Compilers don't warn about it, and are well prepared to not >> misompile it, since it's very commonly used for avoiding aliasing problems. >> >> Roland >> >> >> _______________________________________________ >> mesa-dev mailing list >> mesa-dev@lists.freedesktop.org >> https://urldefense.proofpoint.com/v2/url?u=https-3A__lists.freedesktop.org_mailman_listinfo_mesa-2Ddev&d=CwIFaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r=Vjtt0vs_iqoI31UfJxBl7yv9I2FeiaeAYgMTLKRBc_I&m=yFSuLWBBbLWZDrPaxDVOCjO0cX88sn16LdG-wdamPNQ&s=u4_9w_rDhHuBVjADmDeFiOjw0J-dhP810cv6osVA7iw&e= >> _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev