]> gcc.gnu.org Git - gcc.git/commitdiff
re PR middle-end/23518 (some gcc optimizations do not take overflow into account...
authorKazu Hirata <kazu@codesourcery.com>
Thu, 22 Dec 2005 04:03:32 +0000 (04:03 +0000)
committerKazu Hirata <kazu@gcc.gnu.org>
Thu, 22 Dec 2005 04:03:32 +0000 (04:03 +0000)
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

gcc/ChangeLog
gcc/fold-const.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr23518.c [new file with mode: 0644]

index cdc10e038b633cc565ae8ffcfdc52e8d397b58c4..b1b50aa7398f3c2d764222120b214b5ae7e49305 100644 (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
index 33e27af59f0b07840ee14210e830a609650b1ebe..b801f2ac9e963336090e9f7c8ce7c542f2d39fd3 100644 (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
index b788e59315feef174a2de48ae13bef7d2671cccb..acfd2c89d52b258dca6a766e125a6b414f39dea8 100644 (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.
diff --git a/gcc/testsuite/gcc.dg/pr23518.c b/gcc/testsuite/gcc.dg/pr23518.c
new file mode 100644 (file)
index 0000000..3c6bd27
--- /dev/null
@@ -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 ();
+}
This page took 0.114622 seconds and 5 git commands to generate.