[PR107608] [range-ops] Avoid folding into INF when flag_trapping_math.
authorAldy Hernandez <aldyh@redhat.com>
Tue, 10 Jan 2023 09:57:16 +0000 (10:57 +0100)
committerAldy Hernandez <aldyh@redhat.com>
Sun, 15 Jan 2023 15:42:56 +0000 (16:42 +0100)
commit844190af178c210a6aff6b7eb4dd8c6a49210ff9
tree5f9b8e686c349c021732f6e5a7587c177e8ef8e8
parent5ba715ed1aaf24d4f07c0d250a0a9df03aa0acb2
[PR107608] [range-ops] Avoid folding into INF when flag_trapping_math.

As discussed in the PR, for trapping math, do not fold overflowing
operations into +-INF as doing so could elide a trap.

There is a minor adjustment to known_isinf() where it was mistakenly
returning true for an [infinity U NAN], whereas it should only return
true when the range is exclusively +INF or -INF.  This is benign, as
there were no users of known_isinf up to now.

Tested on x86-64 Linux.

I also ran the glibc testsuite (git sources) on x86-64 and this patch
fixes:

-FAIL: math/test-double-lgamma
-FAIL: math/test-double-log1p
-FAIL: math/test-float-lgamma
-FAIL: math/test-float-log1p
-FAIL: math/test-float128-catan
-FAIL: math/test-float128-catanh
-FAIL: math/test-float128-lgamma
-FAIL: math/test-float128-log
-FAIL: math/test-float128-log1p
-FAIL: math/test-float128-y0
-FAIL: math/test-float128-y1
-FAIL: math/test-float32-lgamma
-FAIL: math/test-float32-log1p
-FAIL: math/test-float32x-lgamma
-FAIL: math/test-float32x-log1p
-FAIL: math/test-float64-lgamma
-FAIL: math/test-float64-log1p
-FAIL: math/test-float64x-lgamma
-FAIL: math/test-ldouble-lgamma

PR tree-optimization/107608

gcc/ChangeLog:

* range-op-float.cc (range_operator_float::fold_range): Avoid
folding into INF when flag_trapping_math.
* value-range.h (frange::known_isinf): Return false for possible NANs.
gcc/range-op-float.cc
gcc/value-range.h