diff options
author | dberlin <dberlin@138bc75d-0d04-0410-961f-82ee72b054a4> | 2006-03-04 00:04:11 +0000 |
---|---|---|
committer | dberlin <dberlin@138bc75d-0d04-0410-961f-82ee72b054a4> | 2006-03-04 00:04:11 +0000 |
commit | c96420f8c5e884ab2071ac460b3672f23c5031d6 (patch) | |
tree | 50268fd54b771d1fee4d2d751a5206f5adca7a71 | |
parent | a135c78b2ad2db070dc44a031204e9618c7ce47e (diff) | |
download | gcc-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/ChangeLog | 11 | ||||
-rw-r--r-- | gcc/tree-sra.c | 12 | ||||
-rw-r--r-- | gcc/tree-ssa-forwprop.c | 22 |
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 */ |