re PR middle-end/38934 (ICE in set_value_range, at tree-vrp.c:398)
authorJakub Jelinek <jakub@redhat.com>
Wed, 28 Jan 2009 10:40:06 +0000 (11:40 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 28 Jan 2009 10:40:06 +0000 (11:40 +0100)
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.

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

From-SVN: r143723

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

index 88de5d2c5abeb889343f44b602c2a2f00e8b7920..66eb17200ced9787ba57ae8d97bd7103c508bdb9 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 2db69bee90cf9df4b0b706daa521135f64c4053a..ae3d55a57ae249e32778c13fc5452a0fd41468d9 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 4b6caca1c37452b65d5335b594159442e7b29f26..8ca65b3385015430463ae60248e38b93f253ab2d 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
        {