summaryrefslogtreecommitdiff
path: root/gcc/tree-vrp.c
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2012-11-28 12:18:39 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2012-11-28 12:18:39 +0000
commit1001fb60ccdb5e929b2cbff7d9954996d2196890 (patch)
treed3aabbe906b306a411332e60aaba0c2f12064e55 /gcc/tree-vrp.c
parent6625d7bc4c6c0b61a45df8918927471b1ab30b7b (diff)
downloadgcc-1001fb60ccdb5e929b2cbff7d9954996d2196890.tar.gz
re PR tree-optimization/54547 (FAIL: gcc.dg/tree-ssa/pr37508.c scan-tree-dump-times vrp1 "Folding" 3)
2012-11-28 Richard Biener <rguenther@suse.de> PR tree-optimization/54547 * tree-vrp.c (set_and_canonicalize_value_range): Handle 1-bit anti-ranges explicitely. (extract_range_from_assert): Properly canonicalize all built anti-ranges. From-SVN: r193888
Diffstat (limited to 'gcc/tree-vrp.c')
-rw-r--r--gcc/tree-vrp.c22
1 files changed, 8 insertions, 14 deletions
diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c
index c9e4e313692..dc03db5d069 100644
--- a/gcc/tree-vrp.c
+++ b/gcc/tree-vrp.c
@@ -541,22 +541,15 @@ set_and_canonicalize_value_range (value_range_t *vr, enum value_range_type t,
return;
}
else if (TYPE_PRECISION (TREE_TYPE (min)) == 1
- && !TYPE_UNSIGNED (TREE_TYPE (min))
&& (is_min || is_max))
{
- /* For signed 1-bit precision, one is not in-range and
- thus adding/subtracting it would result in overflows. */
- if (operand_equal_p (min, max, 0))
- {
- min = max = is_min ? vrp_val_max (TREE_TYPE (min))
- : vrp_val_min (TREE_TYPE (min));
- t = VR_RANGE;
- }
+ /* Non-empty boolean ranges can always be represented
+ as a singleton range. */
+ if (is_min)
+ min = max = vrp_val_max (TREE_TYPE (min));
else
- {
- set_value_range_to_varying (vr);
- return;
- }
+ min = max = vrp_val_min (TREE_TYPE (min));
+ t = VR_RANGE;
}
else if (is_min
/* As a special exception preserve non-null ranges. */
@@ -1707,7 +1700,8 @@ extract_range_from_assert (value_range_t *vr_p, tree expr)
&& vrp_val_is_max (max))
min = max = limit;
- set_value_range (vr_p, VR_ANTI_RANGE, min, max, vr_p->equiv);
+ set_and_canonicalize_value_range (vr_p, VR_ANTI_RANGE,
+ min, max, vr_p->equiv);
}
else if (cond_code == LE_EXPR || cond_code == LT_EXPR)
{