diff options
Diffstat (limited to 'gcc/value-query.cc')
-rw-r--r-- | gcc/value-query.cc | 27 |
1 files changed, 19 insertions, 8 deletions
diff --git a/gcc/value-query.cc b/gcc/value-query.cc index 4637fb4..201f679 100644 --- a/gcc/value-query.cc +++ b/gcc/value-query.cc @@ -217,14 +217,25 @@ range_query::get_tree_range (vrange &r, tree expr, gimple *stmt) return true; case REAL_CST: - if (TREE_OVERFLOW_P (expr)) - expr = drop_tree_overflow (expr); - r.set (expr, expr); - if (real_isnan (TREE_REAL_CST_PTR (expr))) - as_a <frange> (r).set_nan (fp_prop::YES); - else - as_a <frange> (r).set_nan (fp_prop::NO); - return true; + { + if (TREE_OVERFLOW_P (expr)) + expr = drop_tree_overflow (expr); + + frange &f = as_a <frange> (r); + f.set (expr, expr); + + // Singletons from the tree world have known properties. + REAL_VALUE_TYPE *rv = TREE_REAL_CST_PTR (expr); + if (real_isnan (rv)) + f.set_nan (fp_prop::YES); + else + f.set_nan (fp_prop::NO); + if (real_isneg (rv)) + f.set_signbit (fp_prop::YES); + else + f.set_signbit (fp_prop::NO); + return true; + } case SSA_NAME: gimple_range_global (r, expr); |