aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-dom.c
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2009-10-09 18:30:05 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2009-10-09 18:30:05 +0000
commitaabf6a0372105ce6deb5780e39d648e92a491a37 (patch)
treebc4e9a09cb8aa0923418bc4e26f89acdd15cce42 /gcc/tree-ssa-dom.c
parent38265b74007bae4edb7a6b28a17cae94e51b1bdf (diff)
downloadgcc-aabf6a0372105ce6deb5780e39d648e92a491a37.zip
gcc-aabf6a0372105ce6deb5780e39d648e92a491a37.tar.gz
gcc-aabf6a0372105ce6deb5780e39d648e92a491a37.tar.bz2
re PR tree-optimization/41634 (ICE in dom)
2009-10-09 Richard Guenther <rguenther@suse.de> PR tree-optimization/41634 * tree-ssa-dom.c (remove_local_expressions_from_table): Assert we remove the correct elements. (optimize_stmt): Make sure to update stmt operands before optimizing redundancies. * gcc.c-torture/compile/pr41634.c: New testcase. From-SVN: r152596
Diffstat (limited to 'gcc/tree-ssa-dom.c')
-rw-r--r--gcc/tree-ssa-dom.c19
1 files changed, 11 insertions, 8 deletions
diff --git a/gcc/tree-ssa-dom.c b/gcc/tree-ssa-dom.c
index 4bad3dd..1e2c8f2 100644
--- a/gcc/tree-ssa-dom.c
+++ b/gcc/tree-ssa-dom.c
@@ -816,24 +816,25 @@ remove_local_expressions_from_table (void)
/* Remove all the expressions made available in this block. */
while (VEC_length (expr_hash_elt_t, avail_exprs_stack) > 0)
{
- struct expr_hash_elt element;
expr_hash_elt_t victim = VEC_pop (expr_hash_elt_t, avail_exprs_stack);
+ void **slot;
if (victim == NULL)
break;
- element = *victim;
-
/* This must precede the actual removal from the hash table,
as ELEMENT and the table entry may share a call argument
vector which will be freed during removal. */
if (dump_file && (dump_flags & TDF_DETAILS))
{
fprintf (dump_file, "<<<< ");
- print_expr_hash_elt (dump_file, &element);
+ print_expr_hash_elt (dump_file, victim);
}
- htab_remove_elt_with_hash (avail_exprs, &element, element.hash);
+ slot = htab_find_slot_with_hash (avail_exprs,
+ victim, victim->hash, NO_INSERT);
+ gcc_assert (slot && *slot == (void *) victim);
+ htab_clear_slot (avail_exprs, slot);
}
}
@@ -2137,8 +2138,6 @@ optimize_stmt (basic_block bb, gimple_stmt_iterator si)
if (may_optimize_p)
{
- eliminate_redundant_computations (&si);
- stmt = gsi_stmt (si);
if (gimple_code (stmt) == GIMPLE_CALL)
{
/* Resolve __builtin_constant_p. If it hasn't been
@@ -2153,6 +2152,10 @@ optimize_stmt (basic_block bb, gimple_stmt_iterator si)
stmt = gsi_stmt (si);
}
}
+
+ update_stmt_if_modified (stmt);
+ eliminate_redundant_computations (&si);
+ stmt = gsi_stmt (si);
}
/* Record any additional equivalences created by this statement. */
@@ -2188,7 +2191,7 @@ optimize_stmt (basic_block bb, gimple_stmt_iterator si)
{
tree val = NULL;
- update_stmt (stmt);
+ update_stmt_if_modified (stmt);
if (gimple_code (stmt) == GIMPLE_COND)
val = fold_binary_loc (gimple_location (stmt),