Исходя из доклада протестировал такой пример (clang 5.0.1, MSVC 2015, GCC 6), билды 32 и 64:
float invert(float f)
{
unsigned int *i = (unsigned int *)&f;
*i ^= 1 << 31;
return *(float *)i;
}
...
printf("%.2f\n", invert_sign(-3.14f));
никаких UB не обнаружил - взаимодействия с FPU правильные при разных уровнях оптимизации, а также конкретно в GCC с опцией -strict-aliasing, т.е. новые версии компиляторов багом (конкретно на этом примере (?) ) из серии strict aliasing - не грешат.