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