OSDN Git Service

./:
authorian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 26 Mar 2007 21:43:30 +0000 (21:43 +0000)
committerian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 26 Mar 2007 21:43:30 +0000 (21:43 +0000)
PR tree-optimization/31345
* tree-vrp.c (extract_range_from_binary_expr): Turn ranges like
[+INF, +INF(OVF)] into VARYING.
testsuite/:
PR tree-optimization/31345
* gcc.c-torture/compile/pr31345-1.c: New test.

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

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/pr31345-1.c [new file with mode: 0644]
gcc/tree-vrp.c

index 0dc2ec5..b863665 100644 (file)
@@ -1,3 +1,9 @@
+2007-03-26  Ian Lance Taylor  <iant@google.com>
+
+       PR tree-optimization/31345
+       * tree-vrp.c (extract_range_from_binary_expr): Turn ranges like
+       [+INF, +INF(OVF)] into VARYING.
+
 2007-03-26  Zack Weinberg  <zackw@panix.com>
 
        * gengtype-parse.c: New file.
index d9fa344..7ba80be 100644 (file)
@@ -1,3 +1,8 @@
+2007-03-26  Ian Lance Taylor  <iant@google.com>
+
+       PR tree-optimization/31345
+       * gcc.c-torture/compile/pr31345-1.c: New test.
+
 2007-03-26  Brooks Moses  <brooks.moses@codesourcery.com>
 
        * gfortran.dg/func_derived_4.f90: Fix module cleanup.
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr31345-1.c b/gcc/testsuite/gcc.c-torture/compile/pr31345-1.c
new file mode 100644 (file)
index 0000000..fb4d803
--- /dev/null
@@ -0,0 +1,24 @@
+/* PR tree-optimization/31345
+   This caused a crash in VRP when dealing with overflow infinities.  */
+
+void
+dpsnaffle (const char *kbuf)
+{
+  int hash, thash, head[2], off;
+    {
+      int _DP_i;
+      (hash) = 19780211;
+        {
+          (hash) = (hash) + (kbuf)[_DP_i];
+        }
+      (hash) = ((hash) * 43321879) & 0x7FFFFFFF;
+    }
+  while (off != 0)
+    {
+      if (hash > thash) {}
+      else if (hash < thash)
+        {
+          off = head[2];
+        }
+    }
+}
index 262eeb2..3b7358d 100644 (file)
@@ -1982,10 +1982,18 @@ extract_range_from_binary_expr (value_range_t *vr, tree expr)
       return;
     }
 
+  /* We punt if:
+     1) [-INF, +INF]
+     2) [-INF, +-INF(OVF)]
+     3) [+-INF(OVF), +INF]
+     4) [+-INF(OVF), +-INF(OVF)]
+     We learn nothing when we have INF and INF(OVF) on both sides.
+     Note that we do accept [-INF, -INF] and [+INF, +INF] without
+     overflow.  */
   if ((min == TYPE_MIN_VALUE (TREE_TYPE (min))
-       || is_negative_overflow_infinity (min))
+       || is_overflow_infinity (min))
       && (max == TYPE_MAX_VALUE (TREE_TYPE (max))
-         || is_positive_overflow_infinity (max)))
+         || is_overflow_infinity (max)))
     {
       set_value_range_to_varying (vr);
       return;