aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-pre.c
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2016-10-06 12:17:53 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2016-10-06 12:17:53 +0000
commitb397258804e5a50731f1f8084f7992996b0f3ae0 (patch)
tree649109b6e87828a4f4ec949e7392f4ede2ff966f /gcc/tree-ssa-pre.c
parent139dc3c65114ff2497a0391ca7698992eb57f6cd (diff)
downloadgcc-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.c16
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;