tree-vrp.c (extract_range_from_unary_expr): Do not special case symbolics or VR_VARYI...
authorAldy Hernandez <aldyh@redhat.com>
Mon, 17 Sep 2018 06:07:52 +0000 (06:07 +0000)
committerAldy Hernandez <aldyh@gcc.gnu.org>
Mon, 17 Sep 2018 06:07:52 +0000 (06:07 +0000)
* 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.

From-SVN: r264356

gcc/ChangeLog
gcc/tree-vrp.c
gcc/wide-int-range.cc

index 9f6b4b53fc44fcdaa2c29f42a6f6d4fb330130f3..59b73ed089802831212ff2bdb1cf3735995a926b 100644 (file)
@@ -1,3 +1,10 @@
+2018-09-17  Aldy Hernandez  <aldyh@redhat.com>
+
+       * 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.
+
 2018-09-15  Eric Botcazou  <ebotcazou@adacore.com>
 
        PR middle-end/86864
index 1adb919a6dfdea20fe4e3043573b60cc4d8dca9c..622ccbc2df7ffdc010a4dab95987ecfe38231dd5 100644 (file)
@@ -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);
index 8a3dfd256845f74ba2cd1c4f366365c6b3cef020..a85fe9f9ad70fe631d52458a1b1fa2ee7a49f211 100644 (file)
@@ -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;
 }