diff options
author | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-04-15 15:54:26 +0000 |
---|---|---|
committer | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-04-15 15:54:26 +0000 |
commit | fc50275a8ffbe266aa6b315310e7c539709a9c74 (patch) | |
tree | d139306143b692bac93d3adfef5d5c0c64748535 /gcc/tree-ssa-propagate.c | |
parent | 77975172dff7f1febc3c7220d0a67277cbe28bfb (diff) | |
download | gcc-fc50275a8ffbe266aa6b315310e7c539709a9c74.tar.gz |
2008-04-15 Richard Guenther <rguenther@suse.de>
* tree-ssa-propagate.c (substitute_and_fold): Substitute
statements in a basic-block with a backward walk. Do not
substitute into dead statements but instead remove those.
* gcc.dg/fold-compare-2.c: Adjust testcase.
* gcc.dg/tree-ssa/pr21086.c: Likewise.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@134322 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-ssa-propagate.c')
-rw-r--r-- | gcc/tree-ssa-propagate.c | 36 |
1 files changed, 33 insertions, 3 deletions
diff --git a/gcc/tree-ssa-propagate.c b/gcc/tree-ssa-propagate.c index 98847fb377a..c37cfa53545 100644 --- a/gcc/tree-ssa-propagate.c +++ b/gcc/tree-ssa-propagate.c @@ -1211,10 +1211,12 @@ substitute_and_fold (prop_value_t *prop_value, bool use_ranges_p) for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi)) replace_phi_args_in (phi, prop_value); - for (i = bsi_start (bb); !bsi_end_p (i); bsi_next (&i)) + /* Propagate known values into stmts. Do a backward walk to expose + more trivially deletable stmts. */ + for (i = bsi_last (bb); !bsi_end_p (i);) { bool replaced_address, did_replace; - tree prev_stmt = NULL; + tree call, prev_stmt = NULL; tree stmt = bsi_stmt (i); /* Ignore ASSERT_EXPRs. They are used by VRP to generate @@ -1222,7 +1224,33 @@ substitute_and_fold (prop_value_t *prop_value, bool use_ranges_p) afterwards. */ if (TREE_CODE (stmt) == GIMPLE_MODIFY_STMT && TREE_CODE (GIMPLE_STMT_OPERAND (stmt, 1)) == ASSERT_EXPR) - continue; + { + bsi_prev (&i); + continue; + } + + /* No point propagating into a stmt whose result is not used, + but instead we might be able to remove a trivially dead stmt. */ + if (TREE_CODE (stmt) == GIMPLE_MODIFY_STMT + && TREE_CODE (GIMPLE_STMT_OPERAND (stmt, 0)) == SSA_NAME + && !stmt_ann (stmt)->has_volatile_ops + && has_zero_uses (GIMPLE_STMT_OPERAND (stmt, 0)) + && !tree_could_throw_p (stmt) + && (!(call = get_call_expr_in (stmt)) + || !TREE_SIDE_EFFECTS (call))) + { + if (dump_file && dump_flags & TDF_DETAILS) + { + fprintf (dump_file, "Removing dead stmt "); + print_generic_expr (dump_file, stmt, 0); + fprintf (dump_file, "\n"); + } + bsi_remove (&i, true); + release_defs (stmt); + if (!bsi_end_p (i)) + bsi_prev (&i); + continue; + } /* Record the state of the statement before replacements. */ push_stmt_changes (bsi_stmt_ptr (i)); @@ -1298,6 +1326,8 @@ substitute_and_fold (prop_value_t *prop_value, bool use_ranges_p) statement. */ if (use_ranges_p) simplify_stmt_using_ranges (stmt); + + bsi_prev (&i); } } |