From: Richard Biener Date: Tue, 1 Aug 2017 13:36:50 +0000 (+0000) Subject: re PR tree-optimization/81181 (ICE in compute_antic, at tree-ssa-pre.c:2410) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=813485c661151465e415f2eaf8b5316fd7b63cbe;p=gcc.git re PR tree-optimization/81181 (ICE in compute_antic, at tree-ssa-pre.c:2410) 2017-08-01 Richard Biener 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d5fc875705e..83f9b49ba2c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2017-08-01 Richard Biener + + 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 * common.opt (ftree-vectorize): No longer set flag_tree_vectorize. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c25f0210eb4..768321d4215 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-08-01 Richard Biener + + PR tree-optimization/81181 + * gcc.dg/torture/pr81181.c: New testcase. + 2017-08-01 Martin Liska 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 index 00000000000..e7216d7bf3e --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr81181.c @@ -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; +} diff --git a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c index eaadaad5db3..afe898bea9d 100644 --- a/gcc/tree-ssa-pre.c +++ b/gcc/tree-ssa-pre.c @@ -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);