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 | |
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
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/fold-compare-2.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/pr21086.c | 3 | ||||
-rw-r--r-- | gcc/tree-ssa-propagate.c | 36 |
5 files changed, 47 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f2bf992b1d8..9733411e843 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,11 @@ 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. + +2008-04-15 Richard Guenther <rguenther@suse.de> + * params.def (PARAM_MAX_FIELDS_FOR_FIELD_SENSITIVE): Set default to zero, thus disable creation of SFTs. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index aa9fe4770a5..64e45319fc2 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,10 @@ 2008-04-15 Richard Guenther <rguenther@suse.de> + * gcc.dg/fold-compare-2.c: Adjust testcase. + * gcc.dg/tree-ssa/pr21086.c: Likewise. + +2008-04-15 Richard Guenther <rguenther@suse.de> + * gcc.dg/tree-ssa/salias-1.c: Remove. * gcc.dg/tree-ssa/pr26421.c: Adjust pattern. * gcc.dg/tree-ssa/alias-15.c: Likewise. diff --git a/gcc/testsuite/gcc.dg/fold-compare-2.c b/gcc/testsuite/gcc.dg/fold-compare-2.c index bcdb7ad3fcb..6674c4dad6e 100644 --- a/gcc/testsuite/gcc.dg/fold-compare-2.c +++ b/gcc/testsuite/gcc.dg/fold-compare-2.c @@ -15,6 +15,6 @@ main(void) return 0; } -/* { dg-final { scan-tree-dump-times "Removing basic block" 1 "vrp1" } } */ +/* { dg-final { scan-tree-dump-times "Removing basic block" 2 "vrp1" } } */ /* { dg-final { cleanup-tree-dump "vrp\[1-2\]" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr21086.c b/gcc/testsuite/gcc.dg/tree-ssa/pr21086.c index 1498ad75d25..ffaccefe94c 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/pr21086.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr21086.c @@ -15,5 +15,6 @@ foo (int *p) return 0; } -/* { dg-final { scan-tree-dump-times "Folding predicate " 2 "vrp1" } } */ +/* { dg-final { scan-tree-dump-times "Folding predicate " 1 "vrp1" } } */ +/* { dg-final { scan-tree-dump-not "b_. =" "vrp1" } } */ /* { dg-final { cleanup-tree-dump "vrp1" } } */ 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); } } |