diff options
author | Richard Biener <rguenther@suse.de> | 2016-10-06 12:17:53 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2016-10-06 12:17:53 +0000 |
commit | b397258804e5a50731f1f8084f7992996b0f3ae0 (patch) | |
tree | 649109b6e87828a4f4ec949e7392f4ede2ff966f /gcc/tree-ssa-pre.c | |
parent | 139dc3c65114ff2497a0391ca7698992eb57f6cd (diff) | |
download | gcc-b397258804e5a50731f1f8084f7992996b0f3ae0.zip gcc-b397258804e5a50731f1f8084f7992996b0f3ae0.tar.gz gcc-b397258804e5a50731f1f8084f7992996b0f3ae0.tar.bz2 |
re PR tree-optimization/77855 (wrong code at -O3 on x86_64-linux-gnu (in both 32-bit and 64-bit modes))
2016-10-06 Richard Biener <rguenther@suse.de>
PR tree-optimization/77855
* tree-ssa-pre.c (prune_clobbered_mems): Queue exprs to remove
instead of removing the current item while iterating over the set
which is not safe.
* gcc.dg/torture/pr77855.c: New testcase.
From-SVN: r240832
Diffstat (limited to 'gcc/tree-ssa-pre.c')
-rw-r--r-- | gcc/tree-ssa-pre.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c index 39bc254..4f17200 100644 --- a/gcc/tree-ssa-pre.c +++ b/gcc/tree-ssa-pre.c @@ -2025,9 +2025,17 @@ prune_clobbered_mems (bitmap_set_t set, basic_block block) { bitmap_iterator bi; unsigned i; + pre_expr to_remove = NULL; FOR_EACH_EXPR_ID_IN_SET (set, i, bi) { + /* Remove queued expr. */ + if (to_remove) + { + bitmap_remove_from_set (set, to_remove); + to_remove = NULL; + } + pre_expr expr = expression_for_id (i); if (expr->kind == REFERENCE) { @@ -2041,7 +2049,7 @@ prune_clobbered_mems (bitmap_set_t set, basic_block block) block, gimple_bb (def_stmt))) || (gimple_bb (def_stmt) == block && value_dies_in_block_x (expr, block)))) - bitmap_remove_from_set (set, expr); + to_remove = expr; } } else if (expr->kind == NARY) @@ -2053,9 +2061,13 @@ prune_clobbered_mems (bitmap_set_t set, basic_block block) as the available expression might be after the exit point. */ if (BB_MAY_NOTRETURN (block) && vn_nary_may_trap (nary)) - bitmap_remove_from_set (set, expr); + to_remove = expr; } } + + /* Remove queued expr. */ + if (to_remove) + bitmap_remove_from_set (set, to_remove); } static sbitmap has_abnormal_preds; |