diff options
author | Richard Guenther <rguenther@suse.de> | 2009-03-28 10:11:14 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2009-03-28 10:11:14 +0000 |
commit | 6cdb0ee3658b05acfd6e3ffa51047dc4558b14cb (patch) | |
tree | aeb29cda7c04bca0cd95e139b6a68576a97d704f /gcc/tree-ssa-pre.c | |
parent | 8ca1fd7674f5ffff8d7ab4b9a4909073e7d26da1 (diff) | |
download | gcc-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.c | 57 |
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); } } |