diff options
Diffstat (limited to 'gcc/tree-vrp.c')
-rw-r--r-- | gcc/tree-vrp.c | 29 |
1 files changed, 12 insertions, 17 deletions
diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index 428e622..b657546 100644 --- a/gcc/tree-vrp.c +++ b/gcc/tree-vrp.c @@ -3892,15 +3892,6 @@ adjust_range_with_scev (value_range_t *vr, struct loop *loop, max = init; else min = init; - - /* If we would create an invalid range, then just assume we - know absolutely nothing. This may be over-conservative, - but it's clearly safe, and should happen only in unreachable - parts of code, or for invalid programs. */ - if (compare_values (min, max) == 1) - return; - - set_value_range (vr, VR_RANGE, min, max, vr->equiv); } else if (vr->type == VR_RANGE) { @@ -3933,16 +3924,20 @@ adjust_range_with_scev (value_range_t *vr, struct loop *loop, || compare_values (tmax, max) == -1) max = tmax; } + } + else + return; - /* If we just created an invalid range with the minimum - greater than the maximum, we fail conservatively. - This should happen only in unreachable - parts of code, or for invalid programs. */ - if (compare_values (min, max) == 1) - return; + /* If we just created an invalid range with the minimum + greater than the maximum, we fail conservatively. + This should happen only in unreachable + parts of code, or for invalid programs. */ + if (compare_values (min, max) == 1 + || (is_negative_overflow_infinity (min) + && is_positive_overflow_infinity (max))) + return; - set_value_range (vr, VR_RANGE, min, max, vr->equiv); - } + set_value_range (vr, VR_RANGE, min, max, vr->equiv); } |