]> gcc.gnu.org Git - gcc.git/commitdiff
re PR tree-optimization/28905 (ICE in compare_name_with_value, at tree-vrp.c:3557)
authorRichard Guenther <rguenther@suse.de>
Tue, 5 Sep 2006 08:36:39 +0000 (08:36 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 5 Sep 2006 08:36:39 +0000 (08:36 +0000)
2006-09-05  Richard Guenther  <rguenther@suse.de>

PR tree-optimization/28905
* tree-vrp.c (fix_equivalence_set): Manually implement
!value_ranges_intersect_p to also handle symbolic ranges.

* gcc.c-torture/compile/pr28905.c: New testcase.

From-SVN: r116696

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

index b4490c4f8cf160f79d93e1cbe0e89294dffc8b9e..30a49bb379fed9dbd2677f60abf60b3e11e122db 100644 (file)
@@ -1,3 +1,9 @@
+2006-09-05  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/28905
+       * tree-vrp.c (fix_equivalence_set): Manually implement
+       !value_ranges_intersect_p to also handle symbolic ranges.
+
 2006-09-05  Richard Guenther  <rguenther@suse.de>
 
        PR middle-end/28935
index 1a4cda0f8c6b40f2134aa3385a9f7bb4849c7a0d..a1946dddf419709e8de95778a390d515715119b9 100644 (file)
@@ -1,3 +1,8 @@
+2006-09-05  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/28905
+       * gcc.c-torture/compile/pr28905.c: New testcase.
+
 2006-09-05  Richard Guenther  <rguenther@suse.de>
 
        PR middle-end/28935
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr28905.c b/gcc/testsuite/gcc.c-torture/compile/pr28905.c
new file mode 100644 (file)
index 0000000..83a381a
--- /dev/null
@@ -0,0 +1,11 @@
+/* We used to ICE here because after VRP we ended up with
+   non-compatible ranges in a value-range equivalences set.  */
+void code_comment (int size)
+{
+  int i;
+  for (i = 0; i < size; i++)
+    if (i)
+      if (i < 0)
+        if (i < 0)
+          return;
+}
index 5f53211475796bf0446e6f4c6810dbf68abfce93..a2127446a85263f6c3b2b1deaeeeda3ed89ba965 100644 (file)
@@ -774,14 +774,18 @@ fix_equivalence_set (value_range_t *vr_p)
       value_range_t *equiv_vr = vr_value[i];
 
       if (equiv_vr->type == VR_VARYING
-         || equiv_vr->type == VR_UNDEFINED
-         || symbolic_range_p (equiv_vr))
+         || equiv_vr->type == VR_UNDEFINED)
        continue;
 
-      if (equiv_vr->type == VR_RANGE
-         && vr_p->type == VR_RANGE
-         && !value_ranges_intersect_p (vr_p, equiv_vr))
-       bitmap_set_bit (to_remove, i);
+      if (vr_p->type == VR_RANGE
+         && equiv_vr->type == VR_RANGE)
+       {
+         /* Two ranges have an empty intersection if their end points
+            are outside of the other range.  */
+         if (compare_values (equiv_vr->min, vr_p->max) == 1
+             || compare_values (equiv_vr->max, vr_p->min) == -1)
+           bitmap_set_bit (to_remove, i);
+       }
       else if ((equiv_vr->type == VR_RANGE && vr_p->type == VR_ANTI_RANGE)
               || (equiv_vr->type == VR_ANTI_RANGE && vr_p->type == VR_RANGE))
        {
This page took 0.120337 seconds and 5 git commands to generate.