aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-vrp.c
diff options
context:
space:
mode:
authorRichard Sandiford <rdsandiford@googlemail.com>2013-01-02 11:43:22 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2013-01-02 11:43:22 +0000
commit635b0b0cfcbad6c9807d58307d316072f1303011 (patch)
treeeaf13caf18386a72a6812debdbf74552de5aaa98 /gcc/tree-vrp.c
parent4ff4293f15f3a442f6552e764d2127640932b253 (diff)
downloadgcc-635b0b0cfcbad6c9807d58307d316072f1303011.zip
gcc-635b0b0cfcbad6c9807d58307d316072f1303011.tar.gz
gcc-635b0b0cfcbad6c9807d58307d316072f1303011.tar.bz2
tree-vrp.c (range_fits_type_p): Require the MSB of the double_int to be clear for sign changes.
gcc/ * tree-vrp.c (range_fits_type_p): Require the MSB of the double_int to be clear for sign changes. gcc/testsuite/ * gcc.dg/torture/fp-int-convert-2.c: New test. From-SVN: r194800
Diffstat (limited to 'gcc/tree-vrp.c')
-rw-r--r--gcc/tree-vrp.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c
index 4319c60..6b8cbf3 100644
--- a/gcc/tree-vrp.c
+++ b/gcc/tree-vrp.c
@@ -8766,9 +8766,11 @@ range_fits_type_p (value_range_t *vr, unsigned precision, bool unsigned_p)
|| TREE_CODE (vr->max) != INTEGER_CST)
return false;
- /* For precision-preserving sign-changes the MSB of the double-int
- has to be clear. */
- if (src_precision == precision
+ /* For sign changes, the MSB of the double_int has to be clear.
+ An unsigned value with its MSB set cannot be represented by
+ a signed double_int, while a negative value cannot be represented
+ by an unsigned double_int. */
+ if (TYPE_UNSIGNED (src_type) != unsigned_p
&& (TREE_INT_CST_HIGH (vr->min) | TREE_INT_CST_HIGH (vr->max)) < 0)
return false;