aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-vrp.c
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2013-11-26 15:14:52 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2013-11-26 15:14:52 +0000
commit635bfae029c7f2849680a7fdecb7ab07e798564b (patch)
treea18efccf1d3300e4c9b27e6e22290bc25247ee31 /gcc/tree-vrp.c
parenta866fa46ea86c6843bd14be5393e945b76a80334 (diff)
downloadgcc-635bfae029c7f2849680a7fdecb7ab07e798564b.zip
gcc-635bfae029c7f2849680a7fdecb7ab07e798564b.tar.gz
gcc-635bfae029c7f2849680a7fdecb7ab07e798564b.tar.bz2
re PR tree-optimization/59245 (ICE on valid code at -O3 on x86_64-linux-gnu in set_value_range, at tree-vrp.c:443)
2013-11-26 Richard Biener <rguenther@suse.de> PR tree-optimization/59245 * tree-vrp.c (set_value_range): Assert that we don't have overflowed constants (but our infinities). (set_value_range_to_value): Drop all overflow flags. (vrp_visit_phi_node): Likewise. (vrp_visit_assignment_or_call): Use set_value_range_to_value to set a constant range. * gcc.dg/torture/pr59245.c: New testcase. From-SVN: r205395
Diffstat (limited to 'gcc/tree-vrp.c')
-rw-r--r--gcc/tree-vrp.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c
index c47b8e6..171a0f5 100644
--- a/gcc/tree-vrp.c
+++ b/gcc/tree-vrp.c
@@ -441,6 +441,9 @@ set_value_range (value_range_t *vr, enum value_range_type t, tree min,
gcc_assert (min && max);
+ gcc_assert ((!TREE_OVERFLOW_P (min) || is_overflow_infinity (min))
+ && (!TREE_OVERFLOW_P (max) || is_overflow_infinity (max)));
+
if (INTEGRAL_TYPE_P (TREE_TYPE (min)) && t == VR_ANTI_RANGE)
gcc_assert (!vrp_val_is_min (min) || !vrp_val_is_max (max));
@@ -616,7 +619,8 @@ static inline void
set_value_range_to_value (value_range_t *vr, tree val, bitmap equiv)
{
gcc_assert (is_gimple_min_invariant (val));
- val = avoid_overflow_infinity (val);
+ if (TREE_OVERFLOW_P (val))
+ val = drop_tree_overflow (val);
set_value_range (vr, VR_RANGE, val, val, equiv);
}
@@ -6738,8 +6742,8 @@ vrp_visit_assignment_or_call (gimple stmt, tree *output_p)
/* Try folding the statement to a constant first. */
tree tem = gimple_fold_stmt_to_constant (stmt, vrp_valueize);
- if (tem && !is_overflow_infinity (tem))
- set_value_range (&new_vr, VR_RANGE, tem, tem, NULL);
+ if (tem)
+ set_value_range_to_value (&new_vr, tem, NULL);
/* Then dispatch to value-range extracting functions. */
else if (code == GIMPLE_CALL)
extract_range_basic (&new_vr, stmt);
@@ -8336,7 +8340,7 @@ vrp_visit_phi_node (gimple phi)
}
else
{
- if (is_overflow_infinity (arg))
+ if (TREE_OVERFLOW_P (arg))
arg = drop_tree_overflow (arg);
vr_arg.type = VR_RANGE;