re PR tree-optimization/81181 (ICE in compute_antic, at tree-ssa-pre.c:2410)

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
This commit is contained in:
Richard Biener 2017-08-01 13:36:50 +00:00 committed by Richard Biener
parent 4df612fa60
commit 813485c661
4 changed files with 51 additions and 2 deletions

View 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.

View 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

View File

@ -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;
}

View 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);