range-op-float: Remove inappropriate frange_drop_infs call [PR126549]
Checks
| Context |
Check |
Description |
| linaro-tcwg-bot/tcwg_simplebootstrap_build--master-arm-bootstrap |
success
|
Build passed
|
| linaro-tcwg-bot/tcwg_gcc_build--master-arm |
fail
|
Patch failed to apply
|
Commit Message
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 <jakub@redhat.com>
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.
Jakub
Comments
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 <jakub@redhat.com>
>
> 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
@@ -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;
@@ -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 ();
+}
@@ -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 ();
+}