From 3bb3bb2d6e6690c10b502ac21189ae739672d7c4 Mon Sep 17 00:00:00 2001 From: Richard Guenther Date: Tue, 15 Apr 2008 15:54:26 +0000 Subject: [PATCH] tree-ssa-propagate.c (substitute_and_fold): Substitute statements in a basic-block with a backward walk. 2008-04-15 Richard Guenther * 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. From-SVN: r134322 --- gcc/ChangeLog | 6 +++++ gcc/testsuite/ChangeLog | 5 ++++ gcc/testsuite/gcc.dg/fold-compare-2.c | 2 +- gcc/testsuite/gcc.dg/tree-ssa/pr21086.c | 3 ++- 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,3 +1,9 @@ +2008-04-15 Richard Guenther + + * 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 * params.def (PARAM_MAX_FIELDS_FOR_FIELD_SENSITIVE): Set default diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index aa9fe4770a5..64e45319fc2 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2008-04-15 Richard Guenther + + * gcc.dg/fold-compare-2.c: Adjust testcase. + * gcc.dg/tree-ssa/pr21086.c: Likewise. + 2008-04-15 Richard Guenther * gcc.dg/tree-ssa/salias-1.c: Remove. 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); } } -- 2.30.2