re PR tree-optimization/81181 (ICE in compute_antic, at tree-ssa-pre.c:2410)
authorRichard Biener <rguenther@suse.de>
Tue, 1 Aug 2017 13:36:50 +0000 (13:36 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 1 Aug 2017 13:36:50 +0000 (13:36 +0000)
2017-08-01  Richard Biener  <rguenther@suse.de>

PR tree-optimization/81181
* tree-ssa-pre.c (compute_antic_aux): Defer clean() to ...
(compute_antic): ... end of iteration here.

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

From-SVN: r250777

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

index d5fc875705e08dee87e1f37b5f518337ce604f85..83f9b49ba2c37cd4d35bcf5f6b68f2e491ff9ca6 100644 (file)
@@ -1,3 +1,9 @@
+2017-08-01  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/81181
+       * tree-ssa-pre.c (compute_antic_aux): Defer clean() to ...
+       (compute_antic): ... end of iteration here.
+
 2017-08-01  James Greenhalgh  <james.greenhalgh@arm.com>
 
        * common.opt (ftree-vectorize): No longer set flag_tree_vectorize.
index c25f0210eb46f851c4d82a0001909636f3371896..768321d4215c4e1ccac497ab73e8d08259003b90 100644 (file)
@@ -1,3 +1,8 @@
+2017-08-01  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/81181
+       * gcc.dg/torture/pr81181.c: New testcase.
+
 2017-08-01  Martin Liska  <mliska@suse.cz>
 
        PR middle-end/70140
diff --git a/gcc/testsuite/gcc.dg/torture/pr81181.c b/gcc/testsuite/gcc.dg/torture/pr81181.c
new file mode 100644 (file)
index 0000000..e7216d7
--- /dev/null
@@ -0,0 +1,30 @@
+/* { dg-do compile } */
+
+unsigned int lh;
+
+void
+ny (int t3, int ys, int rt, int p8)
+{
+  if (lh != 0)
+    {
+      if (0)
+       {
+oo:
+         do
+           {
+             rt = (p8 != 0) ? t3 : 0;
+             rt = (rt != 0 || lh != (unsigned int)ys);
+             rt += lh + ys;
+           }
+         while (t3 <= 0);
+
+         lh = ys;
+         ys = rt;
+       }
+
+      if (lh != 0)
+       p8 = lh;
+    }
+
+  goto oo;
+}
index eaadaad5db3554d33000afccdd15e653e743e89d..afe898bea9dbc5353499827a1624bd6a47c73f3e 100644 (file)
@@ -2120,7 +2120,8 @@ static sbitmap has_abnormal_preds;
      ANTIC_OUT[BLOCK] = phi_translate (ANTIC_IN[succ(BLOCK)])
 
    ANTIC_IN[BLOCK] = clean(ANTIC_OUT[BLOCK] U EXP_GEN[BLOCK] - TMP_GEN[BLOCK])
-*/
+
+   Note that clean() is deferred until after the iteration.  */
 
 static bool
 compute_antic_aux (basic_block block, bool block_has_abnormal_pred_edge)
@@ -2220,7 +2221,8 @@ compute_antic_aux (basic_block block, bool block_has_abnormal_pred_edge)
     bitmap_value_insert_into_set (ANTIC_IN (block),
                                  expression_for_id (bii));
 
-  clean (ANTIC_IN (block));
+  /* clean (ANTIC_IN (block)) is defered to after the iteration converged
+     because it can cause non-convergence, see for example PR81181.  */
 
   if (!was_visited || !bitmap_set_equal (old, ANTIC_IN (block)))
     changed = true;
@@ -2456,6 +2458,12 @@ compute_antic (void)
       gcc_checking_assert (num_iterations < 500);
     }
 
+  /* We have to clean after the dataflow problem converged as cleaning
+     can cause non-convergence because it is based on expressions
+     rather than values.  */
+  FOR_EACH_BB_FN (block, cfun)
+    clean (ANTIC_IN (block));
+
   statistics_histogram_event (cfun, "compute_antic iterations",
                              num_iterations);