http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59990
--- Comment #6 from Jakub Jelinek <jakub at gcc dot gnu.org> --- I guess the important thing is if it is allowed to raise exceptions on a simple load and store of a floating point value. So: extern void abort (void); union U { unsigned char value[4]; float f; } u = { { 66, 9, 160, 255} }; int main (void) { volatile union U v; v.f = u.f; if (v.value[2] != 160) abort (); return 0; } If it is ok that thiscase aborts and the #c0 should not, then the bug would be in fold-const.c and we should use integral types instead of floating point types to fold the copy. If this testcase shouldn't abort too, then it is a target issue, where it should avoid the i387 loads if the result isn't used in some arithmetic instruction.