aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-pre.c
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2017-10-30 12:45:53 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2017-10-30 12:45:53 +0000
commit51a9f20ca91d656734198405f8955e33adb54189 (patch)
treec36bee2e8670bcffc7493b2bc3a32dc64b7a16d5 /gcc/tree-ssa-pre.c
parentc1136864438968b76d5063c1af99118c19b1cf83 (diff)
downloadgcc-51a9f20ca91d656734198405f8955e33adb54189.zip
gcc-51a9f20ca91d656734198405f8955e33adb54189.tar.gz
gcc-51a9f20ca91d656734198405f8955e33adb54189.tar.bz2
revert: [multiple changes]
2017-10-30 Richard Biener <rguenther@suse.de> PR tree-optimization/82762 Revert 2017-10-23 Richard Biener <rguenther@suse.de> PR tree-optimization/82129 Revert 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/pr82762.c: New testcase. From-SVN: r254218
Diffstat (limited to 'gcc/tree-ssa-pre.c')
-rw-r--r--gcc/tree-ssa-pre.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c
index e4189d1..281f100 100644
--- a/gcc/tree-ssa-pre.c
+++ b/gcc/tree-ssa-pre.c
@@ -2029,7 +2029,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)
@@ -2165,7 +2166,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 (!bitmap_set_equal (old, ANTIC_IN (block)))
changed = true;
@@ -2397,6 +2399,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);