RFR: 8295159: DSO created with -ffast-math breaks Java floating-point arithmetic [v7]
Andrew Haley
aph at openjdk.org
Tue Oct 18 08:42:08 UTC 2022
On Tue, 18 Oct 2022 07:43:13 GMT, Florian Weimer <fweimer at openjdk.org> wrote:
>> Andrew Haley has updated the pull request incrementally with one additional commit since the last revision:
>>
>> 8295159: DSO created with -ffast-math breaks Java floating-point arithmetic
>
> src/hotspot/os/linux/os_linux.cpp line 1759:
>
>> 1757: assert(rtn == 0, "fegetnv must succeed");
>> 1758: void * result = ::dlopen(filename, RTLD_LAZY);
>> 1759: rtn = fesetenv(&curr_fenv);
>
> `fesetenv` in glibc does not unconditionally restore the old FPU control bits, only the non-reserved bits. (The mask is 0xf3f, which seems to cover everything in use today.) It seems unlikely that more bits are going to be defined in the future. But using `fesetenv` to essentially guard against undefined behavior after the fact is a bit awkward.
>
> MXSCR is passed through unconditionally.
Mmm, but `fesetenv` is the only portable thing we have (AFAIK). An alternative to using `fesetenv` everywhere would be to use `fesetenv` in generic code and override it in a per-backend way.
> test/hotspot/jtreg/compiler/floatingpoint/libfast-math.c line 24:
>
>> 22: */
>> 23:
>> 24: // This file is intentionally left blank.
>
> This test will silently break (no longer test what's intended) once we change GCC not to link with `crtfastmath.o` for `-shared`. Maybe you should link with `crtfastmath.o` explicitly if it exists, or change the floating point control word directly in an ELF constructor.
Perhaps so, yes.
-------------
PR: https://git.openjdk.org/jdk/pull/10661
More information about the build-dev
mailing list