re PR tree-optimization/43000 (VRP miscompiles python with -fwrapv)

2010-02-09  Richard Guenther  <rguenther@suse.de>

	PR tree-optimization/43000
	* tree-vrp.c (vrp_int_const_binop): Only handle unsigned
	arithmetic manually.

	* gcc.dg/torture/pr43000.c: New testcase.
	* gcc.dg/torture/pr43002.c: Likewise.

From-SVN: r156621
This commit is contained in:
Richard Guenther 2010-02-09 11:34:28 +00:00 committed by Richard Biener
parent 5e1d6b4c15
commit 9605a6060a
5 changed files with 55 additions and 3 deletions

View File

@ -1,3 +1,9 @@
2010-02-09 Richard Guenther <rguenther@suse.de>
PR tree-optimization/43000
* tree-vrp.c (vrp_int_const_binop): Only handle unsigned
arithmetic manually.
2010-02-08 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/42931

View File

@ -1,3 +1,9 @@
2010-02-09 Richard Guenther <rguenther@suse.de>
PR tree-optimization/43000
* gcc.dg/torture/pr43000.c: New testcase.
* gcc.dg/torture/pr43002.c: Likewise.
2010-02-09 Daniel Kraft <d@domob.eu>
PR fortran/39171

View File

@ -0,0 +1,24 @@
/* { dg-do run } */
/* { dg-options "-fwrapv" } */
int __attribute__((noinline))
foo (long i, long j)
{
if (i >= 1)
if (j > -(long)(((unsigned long)(long)-1)>>1))
{
long x;
j--;
x = i + j;
if (x >= 0)
return 1;
}
return 0;
}
extern void abort (void);
int main()
{
if (foo (1, 1) != 1)
abort ();
return 0;
}

View File

@ -0,0 +1,16 @@
/* { dg-do compile } */
/* { dg-options "-Wall -fwrapv" } */
long A[4], B[100];
void foo(void)
{
int i, j, k = 3;
while (A[k] && k > 0) k--; /* k = {0, 1, 2, 3} */
for (i = 3 - k; i >= 0; i--) /* i = {0..3-k} */
for (j = 0; j <= k; j++) { /* line 8; j = {0..k} */
B[i + j] = 0; /* line 9; i + j = {0..3-k+k} = {0..3} */
for (j = 0; j <= k; j++); /* only one iteration is done, with j == 0 */
}
}

View File

@ -1898,9 +1898,9 @@ vrp_int_const_binop (enum tree_code code, tree val1, tree val2)
res = int_const_binop (code, val1, val2, 0);
/* If we are not using wrapping arithmetic, operate symbolically
on -INF and +INF. */
if (TYPE_OVERFLOW_WRAPS (TREE_TYPE (val1)))
/* If we are using unsigned arithmetic, operate symbolically
on -INF and +INF as int_const_binop only handles signed overflow. */
if (TYPE_UNSIGNED (TREE_TYPE (val1)))
{
int checkz = compare_values (res, val1);
bool overflow = false;