On Tue, Apr 18, 2023 at 12:50:58PM +0200, Aldy Hernandez wrote:
> --- a/gcc/value-range.cc
> +++ b/gcc/value-range.cc
> @@ -232,6 +232,58 @@ vrange::dump (FILE *file) const
>    pp_flush (&buffer);
>  }
>  
> +namespace inchash
> +{
> +
> +void
> +add_vrange (const vrange &v, inchash::hash &hstate,
> +          unsigned int)
> +{
> +  if (v.undefined_p ())
> +    {
> +      hstate.add_int (VR_UNDEFINED);
> +      return;
> +    }
> +  // Types are ignored throughout to inhibit two ranges being equal
> +  // but having different hash values.  This can happen when two
> +  // ranges are equal and their types are different (but
> +  // types_compatible_p is true).
> +  if (is_a <irange> (v))
> +    {
> +      const irange &r = as_a <irange> (v);
> +      if (r.varying_p ())
> +     hstate.add_int (VR_VARYING);
> +      else
> +     hstate.add_int (VR_RANGE);

Shouldn't this also
      hstate.add_int (r.num_pairs ());
?
Or is that unnecessary because different number of add_wide_int
calls will likely result in different hashes then?

Otherwise LGTM.

> +      for (unsigned i = 0; i < r.num_pairs (); ++i)
> +     {
> +       hstate.add_wide_int (r.lower_bound (i));
> +       hstate.add_wide_int (r.upper_bound (i));
> +     }
> +      hstate.add_wide_int (r.get_nonzero_bits ());
> +      return;
> +    }

        Jakub

Reply via email to