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.