Commit efdb3de9 by Daniel Berlin Committed by Daniel Berlin

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
parent 0efaed01
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> 2006-03-03 Diego Novillo <dnovillo@redhat.com>
* tree-ssa-operands.c: Tidy whitespace. Fix spelling. * tree-ssa-operands.c: Tidy whitespace. Fix spelling.
......
...@@ -75,6 +75,9 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA ...@@ -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. */ /* The set of aggregate variables that are candidates for scalarization. */
static bitmap sra_candidates; static bitmap sra_candidates;
...@@ -1432,6 +1435,9 @@ decide_instantiations (void) ...@@ -1432,6 +1435,9 @@ decide_instantiations (void)
bitmap_and_compl_into (needs_copy_in, &done_head); bitmap_and_compl_into (needs_copy_in, &done_head);
} }
bitmap_clear (&done_head); bitmap_clear (&done_head);
if (!bitmap_empty_p (sra_candidates))
todoflags |= TODO_update_smt_usage;
mark_set_for_renaming (sra_candidates); mark_set_for_renaming (sra_candidates);
...@@ -1515,6 +1521,7 @@ generate_one_element_ref (struct sra_elt *elt, tree base) ...@@ -1515,6 +1521,7 @@ generate_one_element_ref (struct sra_elt *elt, tree base)
} }
case ARRAY_TYPE: case ARRAY_TYPE:
todoflags |= TODO_update_smt_usage;
return build4 (ARRAY_REF, elt->type, base, elt->element, NULL, NULL); return build4 (ARRAY_REF, elt->type, base, elt->element, NULL, NULL);
case COMPLEX_TYPE: case COMPLEX_TYPE:
...@@ -2182,6 +2189,7 @@ static unsigned int ...@@ -2182,6 +2189,7 @@ static unsigned int
tree_sra (void) tree_sra (void)
{ {
/* Initialize local variables. */ /* Initialize local variables. */
todoflags = 0;
gcc_obstack_init (&sra_obstack); gcc_obstack_init (&sra_obstack);
sra_candidates = BITMAP_ALLOC (NULL); sra_candidates = BITMAP_ALLOC (NULL);
needs_copy_in = BITMAP_ALLOC (NULL); needs_copy_in = BITMAP_ALLOC (NULL);
...@@ -2204,7 +2212,7 @@ tree_sra (void) ...@@ -2204,7 +2212,7 @@ tree_sra (void)
BITMAP_FREE (sra_type_decomp_cache); BITMAP_FREE (sra_type_decomp_cache);
BITMAP_FREE (sra_type_inst_cache); BITMAP_FREE (sra_type_inst_cache);
obstack_free (&sra_obstack, NULL); obstack_free (&sra_obstack, NULL);
return 0; return todoflags;
} }
static bool static bool
...@@ -2226,7 +2234,7 @@ struct tree_opt_pass pass_sra = ...@@ -2226,7 +2234,7 @@ struct tree_opt_pass pass_sra =
0, /* properties_provided */ 0, /* properties_provided */
PROP_smt_usage, /* properties_destroyed */ PROP_smt_usage, /* properties_destroyed */
0, /* todo_flags_start */ 0, /* todo_flags_start */
TODO_update_smt_usage | TODO_dump_func /* todo_flags_finish */ TODO_dump_func /* todo_flags_finish */
| TODO_update_ssa | TODO_update_ssa
| TODO_ggc_collect | TODO_verify_ssa, | TODO_ggc_collect | TODO_verify_ssa,
0 /* letter */ 0 /* letter */
......
...@@ -792,6 +792,8 @@ forward_propagate_addr_expr_1 (tree stmt, tree use_stmt) ...@@ -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>. /* 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. 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 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) ...@@ -799,7 +801,7 @@ forward_propagate_addr_expr_1 (tree stmt, tree use_stmt)
Returns true, if all uses have been propagated into. */ Returns true, if all uses have been propagated into. */
static bool 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; int stmt_loop_depth = bb_for_stmt (stmt)->loop_depth;
tree name = TREE_OPERAND (stmt, 0); tree name = TREE_OPERAND (stmt, 0);
...@@ -809,6 +811,7 @@ forward_propagate_addr_expr (tree stmt) ...@@ -809,6 +811,7 @@ forward_propagate_addr_expr (tree stmt)
FOR_EACH_IMM_USE_SAFE (imm_use, iter, name) FOR_EACH_IMM_USE_SAFE (imm_use, iter, name)
{ {
bool result;
tree use_stmt = USE_STMT (imm_use); tree use_stmt = USE_STMT (imm_use);
/* If the use is not in a simple assignment statement, then /* If the use is not in a simple assignment statement, then
...@@ -827,8 +830,11 @@ forward_propagate_addr_expr (tree stmt) ...@@ -827,8 +830,11 @@ forward_propagate_addr_expr (tree stmt)
all = false; all = false;
continue; 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; return all;
...@@ -931,6 +937,7 @@ static unsigned int ...@@ -931,6 +937,7 @@ static unsigned int
tree_ssa_forward_propagate_single_use_vars (void) tree_ssa_forward_propagate_single_use_vars (void)
{ {
basic_block bb; basic_block bb;
unsigned int todoflags = 0;
cfg_changed = false; cfg_changed = false;
...@@ -959,10 +966,13 @@ tree_ssa_forward_propagate_single_use_vars (void) ...@@ -959,10 +966,13 @@ tree_ssa_forward_propagate_single_use_vars (void)
if (TREE_CODE (rhs) == ADDR_EXPR) 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); bsi_remove (&bsi, true);
else else
bsi_next (&bsi); bsi_next (&bsi);
if (some)
todoflags |= TODO_update_smt_usage;
} }
else if ((TREE_CODE (rhs) == BIT_NOT_EXPR else if ((TREE_CODE (rhs) == BIT_NOT_EXPR
|| TREE_CODE (rhs) == NEGATE_EXPR) || TREE_CODE (rhs) == NEGATE_EXPR)
...@@ -991,7 +1001,7 @@ tree_ssa_forward_propagate_single_use_vars (void) ...@@ -991,7 +1001,7 @@ tree_ssa_forward_propagate_single_use_vars (void)
if (cfg_changed) if (cfg_changed)
cleanup_tree_cfg (); cleanup_tree_cfg ();
return 0; return todoflags;
} }
...@@ -1014,7 +1024,7 @@ struct tree_opt_pass pass_forwprop = { ...@@ -1014,7 +1024,7 @@ struct tree_opt_pass pass_forwprop = {
0, /* properties_provided */ 0, /* properties_provided */
PROP_smt_usage, /* properties_destroyed */ PROP_smt_usage, /* properties_destroyed */
0, /* todo_flags_start */ 0, /* todo_flags_start */
TODO_update_smt_usage |TODO_dump_func /* todo_flags_finish */ TODO_dump_func /* todo_flags_finish */
| TODO_ggc_collect | TODO_ggc_collect
| TODO_update_ssa | TODO_verify_ssa, | TODO_update_ssa | TODO_verify_ssa,
0 /* letter */ 0 /* letter */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment