OSDN Git Service

PR middle-end/38934
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 28 Jan 2009 10:40:06 +0000 (10:40 +0000)
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 28 Jan 2009 10:40:06 +0000 (10:40 +0000)
* tree-vrp.c (extract_range_from_assert): For LE_EXPR and LT_EXPR
set to varying whenever max has TREE_OVERFLOW set, similarly
for GE_EXPR and GT_EXPR and TREE_OVERFLOW min.

* gcc.dg/pr38934.c: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@143723 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr38934.c [new file with mode: 0644]
gcc/tree-vrp.c

index 88de5d2..66eb172 100644 (file)
@@ -1,3 +1,10 @@
+2009-01-28  Jakub Jelinek  <jakub@redhat.com>
+
+       PR middle-end/38934
+       * tree-vrp.c (extract_range_from_assert): For LE_EXPR and LT_EXPR
+       set to varying whenever max has TREE_OVERFLOW set, similarly
+       for GE_EXPR and GT_EXPR and TREE_OVERFLOW min.
+
 2009-01-28  Richard Guenther  <rguenther@suse.de>
 
        PR middle-end/38908
index 2db69be..ae3d55a 100644 (file)
@@ -1,3 +1,8 @@
+2009-01-28  Jakub Jelinek  <jakub@redhat.com>
+
+       PR middle-end/38934
+       * gcc.dg/pr38934.c: New test.
+
 2009-01-28  Richard Guenther  <rguenther@suse.de>
 
        PR middle-end/38908
diff --git a/gcc/testsuite/gcc.dg/pr38934.c b/gcc/testsuite/gcc.dg/pr38934.c
new file mode 100644 (file)
index 0000000..c05742c
--- /dev/null
@@ -0,0 +1,19 @@
+/* PR middle-end/38934 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -std=gnu99 -w" } */
+
+/* This variable needed only to work around earlier optimizations than VRP.  */
+unsigned char g;
+
+extern void abort ();
+
+void
+f (long long int p)
+{
+  g = 255;
+  if (p >= -9223372036854775808LL - (signed char) g)
+    p = 1;
+
+  if (p)
+    abort ();
+}
index 4b6caca..8ca65b3 100644 (file)
@@ -1620,7 +1620,7 @@ extract_range_from_assert (value_range_t *vr_p, tree expr)
         all should be optimized away above us.  */
       if ((cond_code == LT_EXPR
           && compare_values (max, min) == 0)
-         || is_overflow_infinity (max))
+         || (CONSTANT_CLASS_P (max) && TREE_OVERFLOW (max)))
        set_value_range_to_varying (vr_p);
       else
        {
@@ -1655,7 +1655,7 @@ extract_range_from_assert (value_range_t *vr_p, tree expr)
         all should be optimized away above us.  */
       if ((cond_code == GT_EXPR
           && compare_values (min, max) == 0)
-         || is_overflow_infinity (min))
+         || (CONSTANT_CLASS_P (min) && TREE_OVERFLOW (min)))
        set_value_range_to_varying (vr_p);
       else
        {