wide-int-range.h (wide_int_range_shift_undefined_p): Adjust to use sign as argument.
authorAldy Hernandez <aldyh@redhat.com>
Wed, 17 Oct 2018 12:31:58 +0000 (12:31 +0000)
committerAldy Hernandez <aldyh@gcc.gnu.org>
Wed, 17 Oct 2018 12:31:58 +0000 (12:31 +0000)
* wide-int-range.h (wide_int_range_shift_undefined_p): Adjust to
use sign as argument.
* tree-vrp.c (extract_range_from_binary_expr_1): Pass sign to
wide_int_range_shift_undefined_p.

From-SVN: r265237

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

index b398d1bef1fce160e13eb6d2925c33f572fce2a7..4768b9635f8538c931d7db8fe7e2207a3b88db1b 100644 (file)
@@ -1,3 +1,10 @@
+2018-10-17  Aldy Hernandez  <aldyh@redhat.com>
+
+       * wide-int-range.h (wide_int_range_shift_undefined_p): Adjust to
+       use sign as argument.
+       * tree-vrp.c (extract_range_from_binary_expr_1): Pass sign to
+       wide_int_range_shift_undefined_p.
+
 2018-10-16  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
        * config/aarch64/aarch64.md (despeculate_copy<ALLI_TI:mode>):
index cbc2ea2f26b911117667e8f769e3dcd33638fe9e..c519613bb28308e9e6ef2256c315bb9706889f1b 100644 (file)
@@ -1521,7 +1521,8 @@ extract_range_from_binary_expr_1 (value_range *vr,
           || code == LSHIFT_EXPR)
     {
       if (range_int_cst_p (&vr1)
-         && !wide_int_range_shift_undefined_p (prec,
+         && !wide_int_range_shift_undefined_p (TYPE_SIGN (TREE_TYPE (vr1.min)),
+                                               prec,
                                                wi::to_wide (vr1.min),
                                                wi::to_wide (vr1.max)))
        {
index e9ee418e5b2789b30baf14e7e96b2a5621c7b088..0b2dd223987dff235620136746ae91883aa0680c 100644 (file)
@@ -128,10 +128,11 @@ extern bool wide_int_range_div (wide_int &wmin, wide_int &wmax,
                                bool &extra_range_p,
                                wide_int &extra_min, wide_int &extra_max);
 
-/* Return TRUE if shifting by range [MIN, MAX] is undefined behavior.  */
+/* Return TRUE if shifting by range [MIN, MAX] is undefined behavior,
+   interpreting MIN and MAX according to SIGN.  */
 
 inline bool
-wide_int_range_shift_undefined_p (unsigned prec,
+wide_int_range_shift_undefined_p (signop sign, unsigned prec,
                                  const wide_int &min, const wide_int &max)
 {
   /* ?? Note: The original comment said this only applied to
@@ -142,7 +143,7 @@ wide_int_range_shift_undefined_p (unsigned prec,
      behavior from the shift operation.  We cannot even trust
      SHIFT_COUNT_TRUNCATED at this stage, because that applies to rtl
      shifts, and the operation at the tree level may be widened.  */
-  return wi::sign_mask (min) || wi::ge_p (max, prec, UNSIGNED);
+  return wi::lt_p (min, 0, sign) || wi::ge_p (max, prec, sign);
 }
 
 /* Calculate MIN/MAX_EXPR of two ranges and store the result in [MIN, MAX].  */