Re: [PATCH] range-op-float: Remove inappropriate frange_drop_infs call [PR126549]
Aldy Hernandez <[email protected]> Tue, 04 Aug 2026 09:36:29 +0200
| Newsgroups | gmane.comp.gcc.patches |
|---|---|
| Organization | 0xc0ffee (Drinkers Anonymous) |
| Message-ID | <[email protected]> |
On 2026-08-04 09:15, Jakub Jelinek wrote: OK > Hi! > > 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. > > Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? > > 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. > > --- gcc/range-op-float.cc.jj 2026-07-31 08:55:56.406542081 +0200 > +++ gcc/range-op-float.cc 2026-08-03 13:45:49.794387749 +0200 > @@ -3148,7 +3148,6 @@ operator_cast::fold_range (frange &r, tr > 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; > --- gcc/testsuite/gcc.dg/torture/pr126549.c.jj 2026-08-03 > 13:58:12.124012322 +0200 > +++ gcc/testsuite/gcc.dg/torture/pr126549.c 2026-08-03 > 13:57:58.915179144 +0200 > @@ -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 (); > +} > --- gcc/testsuite/gcc.dg/torture/bitint-107.c.jj 2026-08-03 > 13:58:50.906522507 +0200 > +++ gcc/testsuite/gcc.dg/torture/bitint-107.c 2026-08-03 > 13:59:20.568147890 +0200 > @@ -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 (); > +} > > Jakub