From 4f67dfcf24affdc0336fbfc0ff0611251c9703be Mon Sep 17 00:00:00 2001 From: Jeff Law Date: Thu, 26 Jan 2006 10:14:22 -0700 Subject: re PR ada/25900 (ICE on ACATS cxac004 in Tree-VRP) PR ada/25900 * tree-vrp.c (extract_range_from_assert): When merging a VR_RANGE with a VR_ANTI_RANGE and the VR_ANTI_RANGEis completely contained within the VR_RANGE, use the VR_RANGE as the result, not the VR_ANTI_RANGE. (adjust_range_with_scev): Reject ranges from SCEV which are out of bounds for the type. From-SVN: r110261 --- gcc/tree-vrp.c | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) (limited to 'gcc/tree-vrp.c') diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index c4a921c..843518e 100644 --- a/gcc/tree-vrp.c +++ b/gcc/tree-vrp.c @@ -1059,7 +1059,8 @@ extract_range_from_assert (value_range_t *vr_p, tree expr) 1. The VR_ANTI_RANGE range is competely within the VR_RANGE and the endpoints of the ranges are different. In that case the resulting range - should be the VR_ANTI_RANGE. + should be whichever range is more precise. + Typically that will be the VR_RANGE. 2. The VR_ANTI_RANGE is completely disjoint from the VR_RANGE. In this case the resulting range @@ -1100,8 +1101,8 @@ extract_range_from_assert (value_range_t *vr_p, tree expr) if (compare_values (anti_max, real_max) == -1 && compare_values (anti_min, real_min) == 1) { - set_value_range (vr_p, VR_ANTI_RANGE, anti_min, - anti_max, vr_p->equiv); + set_value_range (vr_p, VR_RANGE, real_min, + real_max, vr_p->equiv); } /* Case 2, VR_ANTI_RANGE completely disjoint from VR_RANGE. */ @@ -1918,12 +1919,21 @@ adjust_range_with_scev (value_range_t *vr, struct loop *loop, tree stmt, { /* For VARYING or UNDEFINED ranges, just about anything we get from scalar evolutions should be better. */ + tree min = TYPE_MIN_VALUE (TREE_TYPE (init)); + tree max = TYPE_MAX_VALUE (TREE_TYPE (init)); + if (init_is_max) - set_value_range (vr, VR_RANGE, TYPE_MIN_VALUE (TREE_TYPE (init)), - init, vr->equiv); + max = init; else - set_value_range (vr, VR_RANGE, init, TYPE_MAX_VALUE (TREE_TYPE (init)), - vr->equiv); + 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. */ + if (compare_values (min, max) == 1) + return; + + set_value_range (vr, VR_RANGE, min, max, vr->equiv); } else if (vr->type == VR_RANGE) { -- cgit v1.1