re PR tree-optimization/28230 (-O2 -fwrapv miscompiles gcc, binutils, gzip.)

2006-10-11  Richard Guenther  <rguenther@suse.de>

	PR tree-optimization/28230
	* tree-vrp.c (vrp_int_const_binop): Move flag_wrapv handling
	to the correct place.

	* gcc.dg/torture/pr28230.c: New testcase.

From-SVN: r117637
This commit is contained in:
Richard Guenther 2006-10-11 16:05:37 +00:00 committed by Richard Biener
parent d233eb7a05
commit 377d569bdb
4 changed files with 34 additions and 5 deletions

View File

@ -1,3 +1,9 @@
2006-10-11 Richard Guenther <rguenther@suse.de>
PR tree-optimization/28230
* tree-vrp.c (vrp_int_const_binop): Move flag_wrapv handling
to the correct place.
2006-10-11 Richard Guenther <rguenther@suse.de>
PR inline-asm/29119

View File

@ -1,3 +1,8 @@
2006-10-11 Richard Guenther <rguenther@suse.de>
PR tree-optimization/28230
* gcc.dg/torture/pr28230.c: New testcase.
2006-10-11 Richard Guenther <rguenther@suse.de>
PR inline-asm/29119

View File

@ -0,0 +1,20 @@
/* { dg-do run } */
/* { dg-options "-fwrapv" } */
void foo( unsigned long long bb, unsigned short tn, unsigned e, unsigned* w );
void foo( unsigned long long bb, unsigned short tn, unsigned e, unsigned* w )
{
unsigned n = tn + bb;
do {
e = (e > n) ? e : *w;
n -= (e > n) ? n : e;
if (*w)
*w = 0;
} while ( n );
}
int main()
{
unsigned w = 0;
foo( 0, 0, 0, &w );
return 0;
}

View File

@ -1235,14 +1235,12 @@ vrp_int_const_binop (enum tree_code code, tree val1, tree val2)
{
tree res;
if (flag_wrapv)
return int_const_binop (code, val1, val2, 0);
res = int_const_binop (code, val1, val2, 0);
/* If we are not using wrapping arithmetic, operate symbolically
on -INF and +INF. */
res = int_const_binop (code, val1, val2, 0);
if (TYPE_UNSIGNED (TREE_TYPE (val1)))
if (TYPE_UNSIGNED (TREE_TYPE (val1))
|| flag_wrapv)
{
int checkz = compare_values (res, val1);
bool overflow = false;