summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKazu Hirata <kazu@codesourcery.com>2005-12-22 04:03:32 +0000
committerKazu Hirata <kazu@gcc.gnu.org>2005-12-22 04:03:32 +0000
commitc078a43735c62e3f90ac80ba1ae01e6d0b83baba (patch)
tree66a616b689f118212742fb5cadb2a0578277dd95
parent8ad4c89538959cda77bcf90164c79b4b74f9f602 (diff)
downloadgcc-c078a43735c62e3f90ac80ba1ae01e6d0b83baba.tar.gz
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
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/fold-const.c5
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/pr23518.c21
4 files changed, 38 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index cdc10e038b6..b1b50aa7398 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,12 @@
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
of vr0.type.
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index 33e27af59f0..b801f2ac9e9 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -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
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index b788e59315f..acfd2c89d52 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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.
diff --git a/gcc/testsuite/gcc.dg/pr23518.c b/gcc/testsuite/gcc.dg/pr23518.c
new file mode 100644
index 00000000000..3c6bd2754e6
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr23518.c
@@ -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 ();
+}