Message ID | 9793f823-aa0a-594a-6689-1dad6722dd7c@redhat.com |
---|---|
State | New |
Headers | show |
Series | VRP: make worst case scenario for ABS_EXPR is still the set of positives | expand |
On 9/14/18 4:25 AM, Aldy Hernandez wrote: > First, there's no sense handling !VR_RANGE and symbolics now that we've > normalized the inputs. > > Second, even if we wrap around while calculating ABS, we at the least > know the result is positive ;-). BTW, we've already handled ABS(-MIN) > and -frapv by the time we get here, so we know we won't get nonsensical > input. > > OK? > > curr.patch > > commit 6e874be13a0bd53811e095328c1d175723f11f84 > Author: Aldy Hernandez <aldyh@redhat.com> > Date: Fri Sep 14 00:03:04 2018 +0200 > > * tree-vrp.c (extract_range_from_unary_expr): Do not special case > symbolics or VR_VARYING ranges for ABS_EXPR. > * wide-int-range.cc (wide_int_range_abs): Return positive numbers > when range will wrap. OK. jeff
commit 6e874be13a0bd53811e095328c1d175723f11f84 Author: Aldy Hernandez <aldyh@redhat.com> Date: Fri Sep 14 00:03:04 2018 +0200 * tree-vrp.c (extract_range_from_unary_expr): Do not special case symbolics or VR_VARYING ranges for ABS_EXPR. * wide-int-range.cc (wide_int_range_abs): Return positive numbers when range will wrap. diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index 1adb919a6df..622ccbc2df7 100644 --- a/gcc/tree-vrp.c +++ b/gcc/tree-vrp.c @@ -1894,11 +1894,6 @@ extract_range_from_unary_expr (value_range *vr, } else if (code == ABS_EXPR) { - if (vr0.type != VR_RANGE || symbolic_range_p (&vr0)) - { - set_value_range_to_varying (vr); - return; - } wide_int wmin, wmax; wide_int vr0_min, vr0_max; extract_range_into_wide_ints (&vr0, sign, prec, vr0_min, vr0_max); diff --git a/gcc/wide-int-range.cc b/gcc/wide-int-range.cc index 8a3dfd25684..a85fe9f9ad7 100644 --- a/gcc/wide-int-range.cc +++ b/gcc/wide-int-range.cc @@ -728,10 +728,13 @@ wide_int_range_abs (wide_int &min, wide_int &max, } /* If the new range has its limits swapped around (MIN > MAX), then - the operation caused one of them to wrap around, mark the new - range VARYING. */ + the operation caused one of them to wrap around. The only thing + we know is that the result is positive. */ if (wi::gt_p (min, max, sign)) - return false; + { + min = wi::zero (prec); + max = max_value; + } return true; }