-2006-01-26 Daniel Berlin <dberlin@dberlin.org>
+2006-01-26 Jeff Law <law@redhat.com>
+
+ 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.
+
+2005-01-26 Daniel Berlin <dberlin@dberlin.org>
* tree-ssa-alias.c (maybe_create_global_var): Change
subvar walking to an assertion that we don't have subvar'd variables.
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
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. */
{
/* 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)
{