tree-ssa-propagate.c (substitute_and_fold): Substitute statements in a basic-block with a backward walk.

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.

From-SVN: r134322
This commit is contained in:
Richard Guenther 2008-04-15 15:54:26 +00:00 committed by Richard Biener
parent d9338cf00c
commit 3bb3bb2d6e
5 changed files with 47 additions and 5 deletions

View File

@ -1,3 +1,9 @@
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

View File

@ -1,3 +1,8 @@
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.

View File

@ -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\]" } } */

View File

@ -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" } } */

View File

@ -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);
}
}