[gcc r17-2924] range-op-float: Remove inappropriate frange_drop_infs call [PR126549]
Jakub Jelinek via Gcc-cvs <[email protected]> Tue, 4 Aug 2026 08:37:58 +0000 (GMT)
| Newsgroups | gmane.comp.gcc.cvs |
|---|---|
| Message-ID | <[email protected]> |
https://gcc.gnu.org/g:217df27883c450f3f098bd0d1dc1ea7d5dbe8ff8 commit r17-2924-g217df27883c450f3f098bd0d1dc1ea7d5dbe8ff8 Author: Jakub Jelinek <[email protected]> Date: Tue Aug 4 10:34:01 2026 +0200 range-op-float: Remove inappropriate frange_drop_infs call [PR126549] For integer to floating conversions I've added frange_drop_infs call into the handler. Supposedly I thought that integers converted to floating point are never +-inf, but that is clearly not the case as the testcases show. For _Float16 it can be +-inf very easily, as the finite range is just [-65504.0f16,65504.0f16], for others all one needs is a large enough _BitInt. The following patch just drops that call. In the common cases, +-inf will not appear in the range anyway, lb and ub will be usually finite. 2026-08-04 Jakub Jelinek <[email protected]> PR tree-optimization/126549 * range-op-float.cc (operator_cast::fold_range): Don't call frange_drop_infs. * gcc.dg/torture/pr126549.c: New test. * gcc.dg/torture/bitint-107.c: New test. Reviewed-by: Aldy Hernandez <[email protected]> Diff: --- gcc/range-op-float.cc | 1 - gcc/testsuite/gcc.dg/torture/bitint-107.c | 18 ++++++++++++++++++ gcc/testsuite/gcc.dg/torture/pr126549.c | 18 ++++++++++++++++++ 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/gcc/range-op-float.cc b/gcc/range-op-float.cc index a625202f5312..c0283a687756 100644 --- a/gcc/range-op-float.cc +++ b/gcc/range-op-float.cc @@ -3148,7 +3148,6 @@ operator_cast::fold_range (frange &r, tree type, const irange &op1, frange_nextafter (mode, ub, dconstinf); } r.set (type, lb, ub, nan_state (false)); - frange_drop_infs (r, type); if (r.undefined_p ()) r.set_varying (type); return true; diff --git a/gcc/testsuite/gcc.dg/torture/bitint-107.c b/gcc/testsuite/gcc.dg/torture/bitint-107.c new file mode 100644 index 000000000000..93a37bafe316 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/bitint-107.c @@ -0,0 +1,18 @@ +/* PR tree-optimization/126549 */ +/* { dg-do run { target { float32 && bitint575 } } } */ +/* { dg-add-options float32 } */ + +[[gnu::noipa]] int +foo (unsigned _BitInt(133) a) +{ + unsigned _BitInt(133) u = a % 5444517870735015415413993718908291383300uwb; + _Float32 h = (_Float32) u; + return h > __FLT32_MAX__; +} + +int +main () +{ + if (foo (5444517870735015415413993718908291383295uwb) != 1) + __builtin_abort (); +} diff --git a/gcc/testsuite/gcc.dg/torture/pr126549.c b/gcc/testsuite/gcc.dg/torture/pr126549.c new file mode 100644 index 000000000000..e87610a17179 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr126549.c @@ -0,0 +1,18 @@ +/* PR tree-optimization/126549 */ +/* { dg-do run { target float16 } } */ +/* { dg-add-options float16 } */ + +[[gnu::noipa]] int +foo (unsigned a) +{ + unsigned u = a % 100001U; + _Float16 h = (_Float16) u; + return h > 65504.0f16; +} + +int +main () +{ + if (foo (70000U) != 1) + __builtin_abort (); +}