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
This commit is contained in:
Richard Sandiford 2013-01-02 11:43:22 +00:00 committed by Richard Sandiford
parent 4ff4293f15
commit 635b0b0cfc
4 changed files with 32 additions and 3 deletions

View File

@ -1,3 +1,8 @@
2013-01-02 Richard Sandiford <rdsandiford@googlemail.com>
* tree-vrp.c (range_fits_type_p): Require the MSB of the double_int
to be clear for sign changes.
2013-01-01 Jan Hubicka <jh@suse.cz>
* ipa-inline-analysis.c: Fix formatting.

View File

@ -1,3 +1,7 @@
2013-01-02 Richard Sandiford <rdsandiford@googlemail.com>
* gcc.dg/torture/fp-int-convert-2.c: New test.
2013-01-01 Jerry DeLisle <jvdelisle@gcc.gnu.org>
* gfortran.dg/newunit_3.f90: Add dg-do run.

View File

@ -0,0 +1,18 @@
/* { dg-do run } */
/* { dg-require-effective-target int128 } */
extern void abort (void);
float __attribute__((noinline))
f (__uint128_t x)
{
return x + 1;
}
int
main (void)
{
if (f (0xffffffffu) == 0)
abort ();
return 0;
}

View File

@ -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;