diff options
author | Richard Biener <rguenther@suse.de> | 2012-11-28 12:18:39 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2012-11-28 12:18:39 +0000 |
commit | 1001fb60ccdb5e929b2cbff7d9954996d2196890 (patch) | |
tree | d3aabbe906b306a411332e60aaba0c2f12064e55 /gcc/tree-vrp.c | |
parent | 6625d7bc4c6c0b61a45df8918927471b1ab30b7b (diff) | |
download | gcc-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.c | 22 |
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) { |