summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/fold-const.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index 9e75466b007..e66240326e9 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -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;