On Fri, Oct 14, 2022 at 04:26:50PM +0200, Aldy Hernandez via Gcc-patches wrote: > Similar to what we do for NANs when !HONOR_NANS and Inf when > flag_finite_math_only, we can remove -0.0 from the range at creation > time. > > We were kinda sorta doing this because there is a bug in > real_isdenormal that is causing flush_denormals_to_zero to saturate > [x, -0.0] to [x, +0.0] when !HONOR_SIGNED_ZEROS. Fixing this bug > (upcoming), causes us to leave -0.0 in places where we aren't > expecting it (the intersection code). > > gcc/ChangeLog: > > * value-range.cc (frange::set): Drop -0.0 for !HONOR_SIGNED_ZEROS.
This looks wrong to me. !HONOR_NANS is different from !HONOR_SIGNED_ZEROS. The former says that either NaNs aren't supported or if they appear, it will be UB. The latter says that either -0.0 doesn't exist, or user doesn't care if -0.0 or 0.0 is used. So, what you do is ok for !MODE_HAS_SIGNED_ZEROS (TYPE_MODE (m_type)), but otherwise we want to canonicalize [x, -0.0] to [x, 0.0] and [0.0, y] to [-0.0, y]. > --- a/gcc/value-range.cc > +++ b/gcc/value-range.cc > @@ -324,6 +324,14 @@ frange::set (tree type, > m_neg_nan = false; > } > > + if (!HONOR_SIGNED_ZEROS (m_type)) > + { > + if (real_iszero (&m_min, 1)) > + m_min.sign = 0; > + if (real_iszero (&m_max, 1)) > + m_max.sign = 0; > + } > + > // For -ffinite-math-only we can drop ranges outside the > // representable numbers to min/max for the type. > if (flag_finite_math_only) > -- > 2.37.3 Jakub