aboutsummaryrefslogtreecommitdiff
path: root/gcc/value-query.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/value-query.cc')
-rw-r--r--gcc/value-query.cc27
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);