diff options
author | Marek Polacek <polacek@redhat.com> | 2016-05-19 15:45:35 +0000 |
---|---|---|
committer | Marek Polacek <mpolacek@gcc.gnu.org> | 2016-05-19 15:45:35 +0000 |
commit | 4177437ead62c0c74d560f3611b3583078f59688 (patch) | |
tree | 5200744a52d46eb0df44b3e719769f1f4e7cdaa1 /gcc/tree-vrp.c | |
parent | 00426f9a9e57175d6373359aec3e7956a6d2a1c1 (diff) | |
download | gcc-4177437ead62c0c74d560f3611b3583078f59688.zip gcc-4177437ead62c0c74d560f3611b3583078f59688.tar.gz gcc-4177437ead62c0c74d560f3611b3583078f59688.tar.bz2 |
re PR tree-optimization/71031 (ICE in extract_range_from_binary_expr_1, at tree-vrp.c:2535 w/ -Os)
PR tree-optimization/71031
* tree-vrp.c (extract_range_from_binary_expr_1): Turn assert into a
condition and adjust the code a bit.
* gcc.dg/tree-ssa/vrp100.c: New test.
From-SVN: r236477
Diffstat (limited to 'gcc/tree-vrp.c')
-rw-r--r-- | gcc/tree-vrp.c | 17 |
1 files changed, 8 insertions, 9 deletions
diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index 69e6248..92d889c 100644 --- a/gcc/tree-vrp.c +++ b/gcc/tree-vrp.c @@ -2519,20 +2519,13 @@ extract_range_from_binary_expr_1 (value_range *vr, min = wide_int_to_tree (expr_type, tmin); max = wide_int_to_tree (expr_type, tmax); } - else if (min_ovf == -1 && max_ovf == 1) - { - /* Underflow and overflow, drop to VR_VARYING. */ - set_value_range_to_varying (vr); - return; - } - else + else if ((min_ovf == -1 && max_ovf == 0) + || (max_ovf == 1 && min_ovf == 0)) { /* Min underflow or max overflow. The range kind changes to VR_ANTI_RANGE. */ bool covers = false; wide_int tem = tmin; - gcc_assert ((min_ovf == -1 && max_ovf == 0) - || (max_ovf == 1 && min_ovf == 0)); type = VR_ANTI_RANGE; tmin = tmax + 1; if (wi::cmp (tmin, tmax, sgn) < 0) @@ -2551,6 +2544,12 @@ extract_range_from_binary_expr_1 (value_range *vr, min = wide_int_to_tree (expr_type, tmin); max = wide_int_to_tree (expr_type, tmax); } + else + { + /* Other underflow and/or overflow, drop to VR_VARYING. */ + set_value_range_to_varying (vr); + return; + } } else { |