On 2/28/23 14:47, Richard Biener via Gcc-patches wrote:
simplify_using_ranges::two_valued_val_range_p has odd code to
verify that an anti-range is two-valued which relies on
num_pairs () returning two for anti-ranges despite there's only
one pair and relying on lower/upper_bound treating that argument
specially.  I cannot convince myself that's even correct.
The following avoids this by using a temporary int_range<2> to
allow anti-ranges to be represented as union of two ranges.

        * vr-values.cc (simplify_using_ranges::two_valued_val_range_p):
        Canonicalize legacy range to int_range<2> before checking
        for two valued-ness.
---
  gcc/vr-values.cc | 7 ++++---
  1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/gcc/vr-values.cc b/gcc/vr-values.cc
index 365f4976a39..c188fff1f8c 100644
--- a/gcc/vr-values.cc
+++ b/gcc/vr-values.cc
@@ -2189,11 +2189,12 @@ bool
  simplify_using_ranges::two_valued_val_range_p (tree var, tree *a, tree *b,
                                               gimple *s)
  {
-  value_range vr = *query->get_value_range (var, s);
-  vr.normalize_symbolics ();
-  if (vr.varying_p () || vr.undefined_p ())
+  value_range r = *query->get_value_range (var, s);
+  r.normalize_symbolics ();
+  if (r.varying_p () || r.undefined_p ())
      return false;
+ int_range<2> vr (r);
    if ((vr.num_pairs () == 1 && vr.upper_bound () - vr.lower_bound () == 1)
        || (vr.num_pairs () == 2
          && vr.lower_bound (0) == vr.upper_bound (0)

This is all fixed in the new code, but no harm in fixing it now. I'll just merge my work with yours.

OK, thanks.

Reply via email to