diff options
author | Richard Sandiford <rdsandiford@googlemail.com> | 2013-01-02 11:43:22 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2013-01-02 11:43:22 +0000 |
commit | 635b0b0cfcbad6c9807d58307d316072f1303011 (patch) | |
tree | eaf13caf18386a72a6812debdbf74552de5aaa98 /gcc/tree-vrp.c | |
parent | 4ff4293f15f3a442f6552e764d2127640932b253 (diff) | |
download | gcc-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.c | 8 |
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; |