https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114659
--- Comment #8 from Bruno Haible <bruno at clisp dot org> --- (In reply to Andrew Pinski from comment #6) > I doubt there is not much to be done here. I see it as an incorrect modelization of the x87 hardware, together with a missing distinction in the common expression elimination / aliasing analysis. In detail: * Incorrect modelization of the x87 hardware: The compiler seems to assume that flds MEM_LOCATION_1 fsts MEM_LOCATION_2 will result in MEM_LOCATION_2 having the same value as MEM_LOCATION_1. This is wrong; this is not how the x87 hardware behaves. The actual result is: *MEM_LOCATION_2 = convert_snan_to_qnan(*MEM_LOCATION_1). * In the common expression elimination / aliasing analysis, the compilers seems to keep track of a set of memory locations MEM_LOCATION_1, ..., MEM_LOCATION_n which have the same value. In fact, this set needs to be partitioned into two sets: a subset which contains the same value, and the complementary subset which contains convert_snan_to_qnan(value). In other words, each element of the set needs to be annotated with a bit that tells whether the value has been subject to the convert_snan_to_qnan.