------- Comment #6 from rguenth at gcc dot gnu dot org  2006-04-26 11:35 -------
It looks like the cases for comparing against type min/max value inside
compare_values are for value_inside_range, which does

  cmp1 = compare_values (val, vr->min);
  if (cmp1 == -2 || cmp1 == 2)
    return -2;
...
  return (cmp1 == 0 || cmp1 == 1) && (cmp2 == -1 || cmp2 == 0);

so we are interested in LE and GE compares here, which compare_values doesn't
handle, but which it could give an answer for even for wrapping arithmetic.

I propose to simply rely on fold here in value_inside_range, so, restructure it
to something like

static inline int
value_inside_range (tree val, value_range_t *vr)
{
  tree cmp1, cmp2;

  cmp1 = fold_binary_to_constant (GE_EXPR, TREE_TYPE (val), vr->min, val);
  if (!cmp1)
    return -2;

  cmp2 = fold_binary_to_constant (LE_EXPR, TREE_TYPE (val), val, vr->max);
  if (!cmp2)
    return -2;

  return integer_onep (cmp1) && integer_onep (cmp2);
}

and completely discard the -INF/+INF comparison stuff from compare_values.

Does this sound reasonable?  (Likewise I noticed that we can replace calls
to compare_values () == 0 with operand_equal_p (), though maybe this is
just canoncalization to compare_values?)


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=25148

Reply via email to