On Fri, Mar 19, 2021 at 10:01:50AM +0100, Aldy Hernandez via Gcc-patches wrote:
> --- a/gcc/value-range.cc
> +++ b/gcc/value-range.cc
> @@ -184,12 +184,46 @@ irange::irange_set (tree min, tree max)
>      verify_range ();
>  }
>  
> +void
> +irange::irange_set_1bit_anti_range (tree min, tree max)
> +{
> +  tree type = TREE_TYPE (min);
> +  gcc_checking_assert (TYPE_PRECISION (type) == 1);
> +
> +  if (operand_equal_p (min, max))
> +    {
> +      // Since these are 1-bit quantities, they can only be [MIN,MIN]
> +      // or [MAX,MAX].
> +      if (vrp_val_is_min (min))
> +     min = max = vrp_val_max (type);
> +      else
> +     min = max = vrp_val_min (type);
> +      set (min, max);
> +    }
> +  else
> +    {
> +      // The only alternative is [MIN,MAX], which is the empty range,
> +      // but legacy code treats this as varying.
> +      gcc_checking_assert (vrp_val_is_min (min));
> +      gcc_checking_assert (vrp_val_is_max (max));
> +      set_varying (type);

Doesn't this mean we handle the precision 1 ranges inconsistently with
the precision 2+ ranges?  Because irange_set_anti_range for min equal
to minimum and max equal to maximum (i.e. VARYING) means
m_num_ranges = 0; (empty range).

> @@ -291,16 +325,10 @@ irange::set (tree min, tree max, value_range_kind kind)
>         set_varying (type);
>         return;
>       }
> -      else if (TYPE_PRECISION (TREE_TYPE (min)) == 1
> -            && (is_min || is_max))
> +      else if (TYPE_PRECISION (TREE_TYPE (min)) == 1)
>       {
> -       /* Non-empty boolean ranges can always be represented
> -          as a singleton range.  */
> -       if (is_min)
> -         min = max = vrp_val_max (TREE_TYPE (min));
> -       else
> -         min = max = vrp_val_min (TREE_TYPE (min));
> -       kind = VR_RANGE;
> +       irange_set_1bit_anti_range (min, max);
> +       return;

This is in else branch of is_min && is_max which results in
varying, so irange_set_1bit_anti_range would not need to deal with that case
for this caller.

        Jakub

Reply via email to