aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-forwprop.c
diff options
context:
space:
mode:
authorDaniel Berlin <dberlin@dberlin.org>2006-03-04 00:04:11 +0000
committerDaniel Berlin <dberlin@gcc.gnu.org>2006-03-04 00:04:11 +0000
commitefdb3de915dd1075975578f61bfe274ad87b5503 (patch)
tree50268fd54b771d1fee4d2d751a5206f5adca7a71 /gcc/tree-ssa-forwprop.c
parent0efaed01c008b4100724d9984e72d82bad1e66f1 (diff)
downloadgcc-efdb3de915dd1075975578f61bfe274ad87b5503.zip
gcc-efdb3de915dd1075975578f61bfe274ad87b5503.tar.gz
gcc-efdb3de915dd1075975578f61bfe274ad87b5503.tar.bz2
tree-sra.c (tree_sra): Return todoflags;
2006-03-03 Daniel Berlin <dberlin@dberlin.org> * tree-sra.c (tree_sra): Return todoflags; (generate_one_element): Set TODO_update_smt_usage if needed. (pass_sra): Remove TODO_update_smt_usage. * tree-ssa-forwprop.c (forward_propagate_addr_expr): Add some parameter. (tree_ssa_forward_propagate_single_use_vars): Return TODO_update_smt_usage if we need to update SMT usage. (pass_forwprop): Remove TODO_update_smt_usage. From-SVN: r111692
Diffstat (limited to 'gcc/tree-ssa-forwprop.c')
-rw-r--r--gcc/tree-ssa-forwprop.c22
1 files changed, 16 insertions, 6 deletions
diff --git a/gcc/tree-ssa-forwprop.c b/gcc/tree-ssa-forwprop.c
index d91ab45..c95d098 100644
--- a/gcc/tree-ssa-forwprop.c
+++ b/gcc/tree-ssa-forwprop.c
@@ -792,6 +792,8 @@ forward_propagate_addr_expr_1 (tree stmt, tree use_stmt)
}
/* STMT is a statement of the form SSA_NAME = ADDR_EXPR <whatever>.
+ SOME is a pointer to a boolean value indicating whether we
+ propagated the address expression anywhere.
Try to forward propagate the ADDR_EXPR into all uses of the SSA_NAME.
Often this will allow for removal of an ADDR_EXPR and INDIRECT_REF
@@ -799,7 +801,7 @@ forward_propagate_addr_expr_1 (tree stmt, tree use_stmt)
Returns true, if all uses have been propagated into. */
static bool
-forward_propagate_addr_expr (tree stmt)
+forward_propagate_addr_expr (tree stmt, bool *some)
{
int stmt_loop_depth = bb_for_stmt (stmt)->loop_depth;
tree name = TREE_OPERAND (stmt, 0);
@@ -809,6 +811,7 @@ forward_propagate_addr_expr (tree stmt)
FOR_EACH_IMM_USE_SAFE (imm_use, iter, name)
{
+ bool result;
tree use_stmt = USE_STMT (imm_use);
/* If the use is not in a simple assignment statement, then
@@ -827,8 +830,11 @@ forward_propagate_addr_expr (tree stmt)
all = false;
continue;
}
-
- all = forward_propagate_addr_expr_1 (stmt, use_stmt) && all;
+
+ result = forward_propagate_addr_expr_1 (stmt, use_stmt);
+ if (some)
+ *some |= result;
+ all &= result;
}
return all;
@@ -931,6 +937,7 @@ static unsigned int
tree_ssa_forward_propagate_single_use_vars (void)
{
basic_block bb;
+ unsigned int todoflags = 0;
cfg_changed = false;
@@ -959,10 +966,13 @@ tree_ssa_forward_propagate_single_use_vars (void)
if (TREE_CODE (rhs) == ADDR_EXPR)
{
- if (forward_propagate_addr_expr (stmt))
+ bool some = false;
+ if (forward_propagate_addr_expr (stmt, &some))
bsi_remove (&bsi, true);
else
bsi_next (&bsi);
+ if (some)
+ todoflags |= TODO_update_smt_usage;
}
else if ((TREE_CODE (rhs) == BIT_NOT_EXPR
|| TREE_CODE (rhs) == NEGATE_EXPR)
@@ -991,7 +1001,7 @@ tree_ssa_forward_propagate_single_use_vars (void)
if (cfg_changed)
cleanup_tree_cfg ();
- return 0;
+ return todoflags;
}
@@ -1014,7 +1024,7 @@ struct tree_opt_pass pass_forwprop = {
0, /* properties_provided */
PROP_smt_usage, /* properties_destroyed */
0, /* todo_flags_start */
- TODO_update_smt_usage |TODO_dump_func /* todo_flags_finish */
+ TODO_dump_func /* todo_flags_finish */
| TODO_ggc_collect
| TODO_update_ssa | TODO_verify_ssa,
0 /* letter */