aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-pre.c
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2009-03-28 10:11:14 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2009-03-28 10:11:14 +0000
commit6cdb0ee3658b05acfd6e3ffa51047dc4558b14cb (patch)
treeaeb29cda7c04bca0cd95e139b6a68576a97d704f /gcc/tree-ssa-pre.c
parent8ca1fd7674f5ffff8d7ab4b9a4909073e7d26da1 (diff)
downloadgcc-6cdb0ee3658b05acfd6e3ffa51047dc4558b14cb.zip
gcc-6cdb0ee3658b05acfd6e3ffa51047dc4558b14cb.tar.gz
gcc-6cdb0ee3658b05acfd6e3ffa51047dc4558b14cb.tar.bz2
re PR tree-optimization/38513 (Only postreload will remove a no-op store)
2009-03-28 Richard Guenther <rguenther@suse.de> PR tree-optimization/38513 * tree-ssa-pre.c (eliminate): Remove redundant stores. * tree-ssa-sccvn.c (copy_reference_ops_from_ref): Handle EXC_PTR_EXPR and FILTER_EXPR. (get_ref_from_reference_ops): Likewise. * gcc.dg/tree-ssa/ssa-fre-21.c: New testcase. * gcc.dg/tree-ssa/ssa-dse-11.c: Adjust. * gcc.dg/vect/vect-reduc-dot-u8a.c: Likewise. * gcc.dg/vect/vect-reduc-dot-u8b.c: Likewise. * gcc.dg/vect/slp-widen-mult-u8.c: Likewise. * gcc.dg/vect/vect-multitypes-16.c: Likewise. * gcc.dg/vect/vect-35.c: Likewise. * gcc.dg/vect/wrapv-vect-reduc-dot-s8b.c: Likewise. * gcc.dg/vect/vect-multitypes-17.c: Likewise. * gcc.dg/vect/slp-widen-mult-s16.c: Likewise. From-SVN: r145172
Diffstat (limited to 'gcc/tree-ssa-pre.c')
-rw-r--r--gcc/tree-ssa-pre.c57
1 files changed, 56 insertions, 1 deletions
diff --git a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c
index 9d931c4..18c442e 100644
--- a/gcc/tree-ssa-pre.c
+++ b/gcc/tree-ssa-pre.c
@@ -3857,7 +3857,7 @@ eliminate (void)
{
gimple_stmt_iterator i;
- for (i = gsi_start_bb (b); !gsi_end_p (i); gsi_next (&i))
+ for (i = gsi_start_bb (b); !gsi_end_p (i);)
{
gimple stmt = gsi_stmt (i);
@@ -3915,6 +3915,7 @@ eliminate (void)
propagate_tree_value_into_stmt (&i, sprime);
stmt = gsi_stmt (i);
update_stmt (stmt);
+ gsi_next (&i);
continue;
}
@@ -3975,6 +3976,58 @@ eliminate (void)
}
}
}
+ /* If the statement is a scalar store, see if the expression
+ has the same value number as its rhs. If so, the store is
+ dead. */
+ else if (gimple_assign_single_p (stmt)
+ && !is_gimple_reg (gimple_assign_lhs (stmt))
+ && (TREE_CODE (gimple_assign_rhs1 (stmt)) == SSA_NAME
+ || is_gimple_min_invariant (gimple_assign_rhs1 (stmt))))
+ {
+ tree rhs = gimple_assign_rhs1 (stmt);
+ tree val;
+ val = vn_reference_lookup (gimple_assign_lhs (stmt),
+ shared_vuses_from_stmt (stmt),
+ true, NULL);
+ if (TREE_CODE (rhs) == SSA_NAME)
+ rhs = VN_INFO (rhs)->valnum;
+ if (val
+ && operand_equal_p (val, rhs, 0))
+ {
+ def_operand_p def;
+ use_operand_p use;
+ vuse_vec_p usevec;
+ ssa_op_iter oi;
+ imm_use_iterator ui;
+ gimple use_stmt;
+
+ if (dump_file && (dump_flags & TDF_DETAILS))
+ {
+ fprintf (dump_file, "Deleted dead store ");
+ print_gimple_stmt (dump_file, stmt, 0, 0);
+ }
+
+ /* Propagate all may-uses to the uses of their defs. */
+ FOR_EACH_SSA_VDEF_OPERAND (def, usevec, stmt, oi)
+ {
+ tree vuse = VUSE_ELEMENT_VAR (*usevec, 0);
+ tree vdef = DEF_FROM_PTR (def);
+
+ /* If the vdef is used in an abnormal PHI node we
+ have to propagate that flag to the vuse as well. */
+ if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (vdef))
+ SSA_NAME_OCCURS_IN_ABNORMAL_PHI (vuse) = 1;
+
+ FOR_EACH_IMM_USE_STMT (use_stmt, ui, vdef)
+ FOR_EACH_IMM_USE_ON_STMT (use, ui)
+ SET_USE (use, vuse);
+ }
+
+ gsi_remove (&i, true);
+ release_defs (stmt);
+ continue;
+ }
+ }
/* Visit COND_EXPRs and fold the comparison with the
available value-numbers. */
else if (gimple_code (stmt) == GIMPLE_COND)
@@ -3999,6 +4052,8 @@ eliminate (void)
todo = TODO_cleanup_cfg;
}
}
+
+ gsi_next (&i);
}
}