re PR middle-end/23518 (some gcc optimizations do not take overflow into account with -fwrapv)

gcc/
	PR tree-optimization/23518
	* fold-const.c (make_range): Don't move a constant to the
	other side of the comparison if the type is signed and -fwrapv
	is given.

gcc/testsuite/
	PR tree-optimization/23518
	* testsuite/gcc.dg/pr23518.c: New.

From-SVN: r108940
This commit is contained in:
Kazu Hirata 2005-12-22 04:03:32 +00:00 committed by Kazu Hirata
parent 8ad4c89538
commit c078a43735
4 changed files with 38 additions and 0 deletions

View File

@ -1,3 +1,10 @@
2005-12-22 Kazu Hirata <kazu@codesourcery.com>
PR tree-optimization/23518
* fold-const.c (make_range): Don't move a constant to the
other side of the comparison if the type is signed and -fwrapv
is given.
2005-12-22 Kazu Hirata <kazu@codesourcery.com>
* tree-vrp.c (extract_range_from_binary_expr): Clean up uses

View File

@ -3836,6 +3836,11 @@ make_range (tree exp, int *pin_p, tree *plow, tree *phigh)
if (TREE_CODE (arg1) != INTEGER_CST)
break;
/* If flag_wrapv and ARG0_TYPE is signed, then we cannot
move a constant to the other side. */
if (flag_wrapv && !TYPE_UNSIGNED (arg0_type))
break;
/* If EXP is signed, any overflow in the computation is undefined,
so we don't worry about it so long as our computations on
the bounds don't overflow. For unsigned, overflow is defined

View File

@ -1,3 +1,8 @@
2005-12-22 Kazu Hirata <kazu@codesourcery.com>
PR tree-optimization/23518
* testsuite/gcc.dg/pr23518.c: New.
2005-12-21 Mike Stump <mrs@apple.com>
* gcc.dg/attr-weakref-1.c: Really skip on darwin.

View File

@ -0,0 +1,21 @@
/* PR tree-optimization/23518.
make_range used to transform a + 1 < 0 into a < -1 even when a is
signed and -fwrapv is given. Make sure that no longer happens. */
/* { dg-do run } */
/* { dg-options "-O2 -fwrapv" } */
#include <limits.h>
extern void abort (void);
extern void exit (int);
int
main (void)
{
int a = INT_MAX;
if ((a < 0) || (a + 1 < 0))
exit (0);
abort ();
}