From: Richard Biener Date: Wed, 28 Nov 2012 12:18:39 +0000 (+0000) Subject: re PR tree-optimization/54547 (FAIL: gcc.dg/tree-ssa/pr37508.c scan-tree-dump-times... X-Git-Tag: releases/gcc-4.8.0~1736 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=1001fb60ccdb5e929b2cbff7d9954996d2196890;p=thirdparty%2Fgcc.git re PR tree-optimization/54547 (FAIL: gcc.dg/tree-ssa/pr37508.c scan-tree-dump-times vrp1 "Folding" 3) 2012-11-28 Richard Biener 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4890147487c2..128062da83fe 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2012-11-28 Richard Biener + + 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. + 2012-11-28 Eric Botcazou * stor-layout.c (layout_type) : Do not clear TREE_OVERFLOW diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index c9e4e313692f..dc03db5d069b 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) {