summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordberlin <dberlin@138bc75d-0d04-0410-961f-82ee72b054a4>2006-03-04 00:04:11 +0000
committerdberlin <dberlin@138bc75d-0d04-0410-961f-82ee72b054a4>2006-03-04 00:04:11 +0000
commitc96420f8c5e884ab2071ac460b3672f23c5031d6 (patch)
tree50268fd54b771d1fee4d2d751a5206f5adca7a71
parenta135c78b2ad2db070dc44a031204e9618c7ce47e (diff)
downloadgcc-c96420f8c5e884ab2071ac460b3672f23c5031d6.tar.gz
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@111692 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog11
-rw-r--r--gcc/tree-sra.c12
-rw-r--r--gcc/tree-ssa-forwprop.c22
3 files changed, 37 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index aa9bfbf6c44..07edcc35ff3 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,14 @@
+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.
+
2006-03-03 Diego Novillo <dnovillo@redhat.com>
* tree-ssa-operands.c: Tidy whitespace. Fix spelling.
diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c
index 0b594b945e2..1faff832799 100644
--- a/gcc/tree-sra.c
+++ b/gcc/tree-sra.c
@@ -75,6 +75,9 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
*/
+/* The set of todo flags to return from tree_sra. */
+static unsigned int todoflags;
+
/* The set of aggregate variables that are candidates for scalarization. */
static bitmap sra_candidates;
@@ -1432,6 +1435,9 @@ decide_instantiations (void)
bitmap_and_compl_into (needs_copy_in, &done_head);
}
bitmap_clear (&done_head);
+
+ if (!bitmap_empty_p (sra_candidates))
+ todoflags |= TODO_update_smt_usage;
mark_set_for_renaming (sra_candidates);
@@ -1515,6 +1521,7 @@ generate_one_element_ref (struct sra_elt *elt, tree base)
}
case ARRAY_TYPE:
+ todoflags |= TODO_update_smt_usage;
return build4 (ARRAY_REF, elt->type, base, elt->element, NULL, NULL);
case COMPLEX_TYPE:
@@ -2182,6 +2189,7 @@ static unsigned int
tree_sra (void)
{
/* Initialize local variables. */
+ todoflags = 0;
gcc_obstack_init (&sra_obstack);
sra_candidates = BITMAP_ALLOC (NULL);
needs_copy_in = BITMAP_ALLOC (NULL);
@@ -2204,7 +2212,7 @@ tree_sra (void)
BITMAP_FREE (sra_type_decomp_cache);
BITMAP_FREE (sra_type_inst_cache);
obstack_free (&sra_obstack, NULL);
- return 0;
+ return todoflags;
}
static bool
@@ -2226,7 +2234,7 @@ struct tree_opt_pass pass_sra =
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_update_ssa
| TODO_ggc_collect | TODO_verify_ssa,
0 /* letter */
diff --git a/gcc/tree-ssa-forwprop.c b/gcc/tree-ssa-forwprop.c
index d91ab45b331..c95d098089d 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 */