fold-const.c (make_range, [...]): Correct normalization of an unsigned range that...
authorJeff Law <law@gcc.gnu.org>
Fri, 1 Nov 1996 03:10:33 +0000 (20:10 -0700)
committerJeff Law <law@gcc.gnu.org>
Fri, 1 Nov 1996 03:10:33 +0000 (20:10 -0700)
        * fold-const.c (make_range, case PLUS_EXPR): Correct
        normalization of an unsigned range that wraps around zero.

From-SVN: r13089

gcc/fold-const.c

index 9e75466b007fe828c04d892945c577cc55c64b93..e66240326e9e7b925abd8e7e1fdc79aafa6efd1a 100644 (file)
@@ -2814,10 +2814,16 @@ make_range (exp, pin_p, plow, phigh)
              || (n_high != 0 && TREE_OVERFLOW (n_high)))
            break;
 
-         /* Check for a range which has wrapped around the maximum value
-            thus making n_high < n_low.  Normalize any such range it.  */
+         /* Check for an unsigned range which has wrapped around the maximum
+            value thus making n_high < n_low, and normalize it.  */
          if (n_low && n_high && tree_int_cst_lt (n_high, n_low))
-           low = n_high, high = n_low, in_p = ! in_p;
+           {
+             low = range_binop (PLUS_EXPR, type, n_high, 0,
+                                convert (type, integer_one_node), 0);
+             high = range_binop (MINUS_EXPR, type, n_low, 0,
+                                convert (type, integer_one_node), 0);
+             in_p = ! in_p;
+           }
          else
            low = n_low, high = n_high;