https://gcc.gnu.org/g:ab5addf0674f07d64b18695a54f1b43bb99e61a4
commit r17-3041-gab5addf0674f07d64b18695a54f1b43bb99e61a4 Author: Aldy Hernandez <[email protected]> Date: Thu Aug 6 14:33:18 2026 +0000 [frange] Convert frange_add_zeros to multi-range frange_add_zeros ensures both -0.0 and +0.0 are present whenever the range holds a zero, but it detected the zero via the hull endpoints. For a multi-pair range whose zero sits on an inner boundary, it failed to add +0.0. For example, for [-1.0,-0.0][1.0,1.0] which has a hull of [-1.0,1.0], it failed to add +0.0. Tested on ppc64le Linux: regstrap and LAPACK. gcc/ChangeLog: * range-op-float.cc (frange_add_zeros): Detect a contained zero with the contains_zero_p method instead of inspecting the hull endpoints. (range_op_float_tests): Test that op1_range for == admits +0.0 for a multi-pair operand holding an inner -0.0. Diff: --- gcc/range-op-float.cc | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/gcc/range-op-float.cc b/gcc/range-op-float.cc index ba6af5851c26..ebf4f4e8ad80 100644 --- a/gcc/range-op-float.cc +++ b/gcc/range-op-float.cc @@ -476,8 +476,7 @@ frange_add_zeros (frange &r, tree type) if (r.undefined_p () || r.known_isnan ()) return; - if (HONOR_SIGNED_ZEROS (type) - && (real_iszero (&r.lower_bound ()) || real_iszero (&r.upper_bound ()))) + if (HONOR_SIGNED_ZEROS (type) && r.contains_zero_p ()) { frange zero; zero.set_zero (type); @@ -3269,6 +3268,18 @@ range_op_float_tests () REAL_VALUE_TYPE five; real_from_string (&five, "5.0"); ASSERT_FALSE (r.contains_p (five)); + + // op1_range for "op1 == op2" where op2 = [-1.0,-0.0][1.0,1.0] holds -0.0 but + // not +0.0 must still admit +0.0 for op1, since -0.0 == +0.0. + r0 = frange_float ("-1.0", "-0.0"); + r1 = frange_float ("1.0", "1.0"); + r0.union_ (r1); + r0.clear_nan (); + ASSERT_FALSE (r0.contains_p (dconst0)); + ASSERT_TRUE (r0.contains_p (dconstm0)); + int_range<2> bool_true = range_true (); + range_op_handler (EQ_EXPR).op1_range (r, float_type_node, bool_true, r0); + ASSERT_TRUE (r.contains_p (dconst0)); } } // namespace selftest
