diff options
Diffstat (limited to 'gcc/tree-vrp.c')
-rw-r--r-- | gcc/tree-vrp.c | 19 |
1 files changed, 11 insertions, 8 deletions
diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index 1734d44..11c8077 100644 --- a/gcc/tree-vrp.c +++ b/gcc/tree-vrp.c @@ -1975,7 +1975,7 @@ adjust_range_with_scev (value_range_t *vr, struct loop *loop, tree stmt, tree var) { tree init, step, chrec; - bool init_is_max, unknown_max; + enum ev_direction dir; /* TODO. Don't adjust anti-ranges. An anti-range may provide better opportunities than a regular range, but I'm not sure. */ @@ -1998,11 +1998,14 @@ adjust_range_with_scev (value_range_t *vr, struct loop *loop, tree stmt, || !valid_value_p (init)) return; - /* Do not adjust ranges when chrec may wrap. */ - if (scev_probably_wraps_p (chrec_type (chrec), init, step, stmt, - current_loops->parray[CHREC_VARIABLE (chrec)], - &init_is_max, &unknown_max) - || unknown_max) + dir = scev_direction (chrec); + if (/* Do not adjust ranges if we do not know whether the iv increases + or decreases, ... */ + dir == EV_DIR_UNKNOWN + /* ... or if it may wrap. */ + || scev_probably_wraps_p (init, step, stmt, + current_loops->parray[CHREC_VARIABLE (chrec)], + true)) return; if (!POINTER_TYPE_P (TREE_TYPE (init)) @@ -2013,7 +2016,7 @@ adjust_range_with_scev (value_range_t *vr, struct loop *loop, tree stmt, tree min = TYPE_MIN_VALUE (TREE_TYPE (init)); tree max = TYPE_MAX_VALUE (TREE_TYPE (init)); - if (init_is_max) + if (dir == EV_DIR_DECREASES) max = init; else min = init; @@ -2031,7 +2034,7 @@ adjust_range_with_scev (value_range_t *vr, struct loop *loop, tree stmt, tree min = vr->min; tree max = vr->max; - if (init_is_max) + if (dir == EV_DIR_DECREASES) { /* INIT is the maximum value. If INIT is lower than VR->MAX but no smaller than VR->MIN, set VR->MAX to INIT. */ |