re PR tree-optimization/84830 (ICE in compute_antic, at tree-ssa-pre.c:2388)
authorRichard Biener <rguenther@suse.de>
Wed, 14 Mar 2018 08:07:45 +0000 (08:07 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Wed, 14 Mar 2018 08:07:45 +0000 (08:07 +0000)
2018-03-14  Richard Biener  <rguenther@suse.de>

PR tree-optimization/84830
* tree-ssa-pre.c (compute_antic_aux): Intersect the new ANTIC_IN
with the old one to avoid oscillations.

* gcc.dg/torture/pr84830.c: New testcase.

From-SVN: r258514

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr84830.c [new file with mode: 0644]
gcc/tree-ssa-pre.c

index 5eaafcfb9bbed3c6fa263edd9d1549d64213b4fe..550e2b6b3e003b9a96109f4c99b7f74d71b0111b 100644 (file)
@@ -1,3 +1,9 @@
+2018-03-14  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/84830
+       * tree-ssa-pre.c (compute_antic_aux): Intersect the new ANTIC_IN
+       with the old one to avoid oscillations.
+
 2018-03-13  Vladimir Makarov  <vmakarov@redhat.com>
 
        PR target/83712
index a4bf53c8bc45c8ada628bfff80a78ed2b0b7e587..0175d4342c0a56ae285cd2b2000575400d5e9a9f 100644 (file)
@@ -1,3 +1,8 @@
+2018-03-14  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/84830
+       * gcc.dg/torture/pr84830.c: New testcase.
+
 2018-03-14  Marek Polacek  <polacek@redhat.com>
 
        PR c++/84596
diff --git a/gcc/testsuite/gcc.dg/torture/pr84830.c b/gcc/testsuite/gcc.dg/torture/pr84830.c
new file mode 100644 (file)
index 0000000..d076170
--- /dev/null
@@ -0,0 +1,46 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-fno-tree-ch -fno-tree-vrp" } */
+
+int x0;
+
+void
+br (int yp, int oo)
+{
+  int *qi = &yp;
+
+  if (oo == 0)
+    {
+g8:
+      if (x0 != 0)
+       x0 = yp;
+      else if (oo != 0)
+       x0 = yp;
+
+      if (x0 == 0)
+       {
+         *qi = 0;
+         x0 = *qi;
+       }
+
+      if (x0 != 0)
+       {
+         ++oo;
+         goto g8;
+       }
+
+      if (yp == oo)
+       yp += !!oo;
+    }
+  else
+    {
+      x0 = 1;
+      while (x0 < 2)
+       {
+         qi = &oo;
+         ++oo;
+         x0 = 1;
+       }
+    }
+
+  goto g8;
+}
index f165a1eb9759a69074c46711abd9aefb40696215..c3d2bbac957840b48f1e17071dfb0206bf69e0c3 100644 (file)
@@ -2154,6 +2154,35 @@ compute_antic_aux (basic_block block, bool block_has_abnormal_pred_edge)
   /* clean (ANTIC_IN (block)) is defered to after the iteration converged
      because it can cause non-convergence, see for example PR81181.  */
 
+  /* Intersect ANTIC_IN with the old ANTIC_IN.  This is required until
+     we properly represent the maximum expression set, thus not prune
+     values without expressions during the iteration.  */
+  if (was_visited
+      && bitmap_and_into (&ANTIC_IN (block)->values, &old->values))
+    {
+      if (dump_file && (dump_flags & TDF_DETAILS))
+       fprintf (dump_file, "warning: intersecting with old ANTIC_IN "
+                "shrinks the set\n");
+      /* Prune expressions not in the value set.  */
+      bitmap_iterator bi;
+      unsigned int i;
+      unsigned int to_clear = -1U;
+      FOR_EACH_EXPR_ID_IN_SET (ANTIC_IN (block), i, bi)
+       {
+         if (to_clear != -1U)
+           {
+             bitmap_clear_bit (&ANTIC_IN (block)->expressions, to_clear);
+             to_clear = -1U;
+           }
+         pre_expr expr = expression_for_id (i);
+         unsigned int value_id = get_expr_value_id (expr);
+         if (!bitmap_bit_p (&ANTIC_IN (block)->values, value_id))
+           to_clear = i;
+       }
+      if (to_clear != -1U)
+       bitmap_clear_bit (&ANTIC_IN (block)->expressions, to_clear);
+    }
+
   if (!bitmap_set_equal (old, ANTIC_IN (block)))
     {
       changed = true;