Commit 6cedb4ac by Jeff Law Committed by Jeff Law

tree-ssa-dom.c (cprop_into_stmt): Do not call recompute_tree_invariant_for_addr_expr here.


	* tree-ssa-dom.c (cprop_into_stmt): Do not call
	recompute_tree_invariant_for_addr_expr here.
	(optimize_stmt): Call it here instead and do so if anything
	at all has changed in the statement and the RHS is an ADDR_EXPR.
	* tree-ssa-forwprop.c (tidy_after_forward_propagate_addr): If
	needed, call recompute_tree_invariant_for_addr_expr.
	* tree-ssa-propagate.c (substitute_and_fold): Call
	recompute_tree_invariant_for_addr_expr as needed.


	* gcc.c-torture/compile/pr21638.c: New test.
	* gcc.c-torture/compile/20050520-1.c: New test.

From-SVN: r100092
parent 0d14c011
2005-05-23 Jeff Law <law@redhat.com>
* tree-ssa-dom.c (cprop_into_stmt): Do not call
recompute_tree_invariant_for_addr_expr here.
(optimize_stmt): Call it here instead and do so if anything
at all has changed in the statement and the RHS is an ADDR_EXPR.
* tree-ssa-forwprop.c (tidy_after_forward_propagate_addr): If
needed, call recompute_tree_invariant_for_addr_expr.
* tree-ssa-propagate.c (substitute_and_fold): Call
recompute_tree_invariant_for_addr_expr as needed.
2005-05-23 Andreas Krebbel <krebbel1@de.ibm.com> 2005-05-23 Andreas Krebbel <krebbel1@de.ibm.com>
* config/s390/s390.c (s390_optimize_prologue): Don't replace an insn * config/s390/s390.c (s390_optimize_prologue): Don't replace an insn
......
2005-05-23 Jeff Law <law@redhat.com>
* gcc.c-torture/compile/pr21638.c: New test.
* gcc.c-torture/compile/20050520-1.c: New test.
2005-05-23 Nick Clifton <nickc@redhat.com> 2005-05-23 Nick Clifton <nickc@redhat.com>
* gcc.c-torture/execute/20020720-1.x: Fix m32r target selector to * gcc.c-torture/execute/20020720-1.x: Fix m32r target selector to
......
struct s { int x[4]; };
struct s gs;
void
bar (void)
{
struct s *s;
int i;
s = &gs;
for (i = 0; i < 4; i++)
((char*) (&s->x[i]))[0] = 0;
}
typedef struct hashhdr {
int bitmaps[32];
} HASHHDR;
static void
swap_header_copy(HASHHDR *srcp, HASHHDR *destp)
{
int i;
for (i = 0; i < 32; i++)
((char *)&(destp->bitmaps[i]))[0] = ((char *)&(srcp->bitmaps[i]))[1];
}
int
flush_meta(HASHHDR *whdrp1)
{
HASHHDR *whdrp;
HASHHDR whdr;
whdrp = &whdr;
swap_header_copy(whdrp1, whdrp);
return (0);
}
...@@ -2908,7 +2908,6 @@ cprop_into_stmt (tree stmt) ...@@ -2908,7 +2908,6 @@ cprop_into_stmt (tree stmt)
bool may_have_exposed_new_symbols = false; bool may_have_exposed_new_symbols = false;
use_operand_p op_p; use_operand_p op_p;
ssa_op_iter iter; ssa_op_iter iter;
tree rhs;
FOR_EACH_SSA_USE_OPERAND (op_p, stmt, iter, SSA_OP_ALL_USES) FOR_EACH_SSA_USE_OPERAND (op_p, stmt, iter, SSA_OP_ALL_USES)
{ {
...@@ -2916,13 +2915,6 @@ cprop_into_stmt (tree stmt) ...@@ -2916,13 +2915,6 @@ cprop_into_stmt (tree stmt)
may_have_exposed_new_symbols |= cprop_operand (stmt, op_p); may_have_exposed_new_symbols |= cprop_operand (stmt, op_p);
} }
if (may_have_exposed_new_symbols)
{
rhs = get_rhs (stmt);
if (rhs && TREE_CODE (rhs) == ADDR_EXPR)
recompute_tree_invarant_for_addr_expr (rhs);
}
return may_have_exposed_new_symbols; return may_have_exposed_new_symbols;
} }
...@@ -2971,6 +2963,8 @@ optimize_stmt (struct dom_walk_data *walk_data, basic_block bb, ...@@ -2971,6 +2963,8 @@ optimize_stmt (struct dom_walk_data *walk_data, basic_block bb,
fold its RHS before checking for redundant computations. */ fold its RHS before checking for redundant computations. */
if (ann->modified) if (ann->modified)
{ {
tree rhs;
/* Try to fold the statement making sure that STMT is kept /* Try to fold the statement making sure that STMT is kept
up to date. */ up to date. */
if (fold_stmt (bsi_stmt_ptr (si))) if (fold_stmt (bsi_stmt_ptr (si)))
...@@ -2985,6 +2979,10 @@ optimize_stmt (struct dom_walk_data *walk_data, basic_block bb, ...@@ -2985,6 +2979,10 @@ optimize_stmt (struct dom_walk_data *walk_data, basic_block bb,
} }
} }
rhs = get_rhs (stmt);
if (rhs && TREE_CODE (rhs) == ADDR_EXPR)
recompute_tree_invarant_for_addr_expr (rhs);
/* Constant/copy propagation above may change the set of /* Constant/copy propagation above may change the set of
virtual operands associated with this statement. Folding virtual operands associated with this statement. Folding
may remove the need for some virtual operands. may remove the need for some virtual operands.
......
...@@ -446,12 +446,16 @@ static void ...@@ -446,12 +446,16 @@ static void
tidy_after_forward_propagate_addr (tree stmt) tidy_after_forward_propagate_addr (tree stmt)
{ {
mark_new_vars_to_rename (stmt); mark_new_vars_to_rename (stmt);
update_stmt (stmt);
/* We may have turned a trapping insn into a non-trapping insn. */ /* We may have turned a trapping insn into a non-trapping insn. */
if (maybe_clean_or_replace_eh_stmt (stmt, stmt) if (maybe_clean_or_replace_eh_stmt (stmt, stmt)
&& tree_purge_dead_eh_edges (bb_for_stmt (stmt))) && tree_purge_dead_eh_edges (bb_for_stmt (stmt)))
cfg_changed = true; cfg_changed = true;
if (TREE_CODE (TREE_OPERAND (stmt, 1)) == ADDR_EXPR)
recompute_tree_invarant_for_addr_expr (TREE_OPERAND (stmt, 1));
update_stmt (stmt);
} }
/* STMT defines LHS which is contains the address of the 0th element /* STMT defines LHS which is contains the address of the 0th element
......
...@@ -1052,8 +1052,10 @@ substitute_and_fold (prop_value_t *prop_value) ...@@ -1052,8 +1052,10 @@ substitute_and_fold (prop_value_t *prop_value)
if (did_replace) if (did_replace)
{ {
tree old_stmt = stmt; tree old_stmt = stmt;
tree rhs;
fold_stmt (bsi_stmt_ptr (i)); fold_stmt (bsi_stmt_ptr (i));
stmt = bsi_stmt(i); stmt = bsi_stmt (i);
/* If we folded a builtin function, we'll likely /* If we folded a builtin function, we'll likely
need to rename VDEFs. */ need to rename VDEFs. */
...@@ -1063,6 +1065,10 @@ substitute_and_fold (prop_value_t *prop_value) ...@@ -1063,6 +1065,10 @@ substitute_and_fold (prop_value_t *prop_value)
remove EH edges. */ remove EH edges. */
if (maybe_clean_or_replace_eh_stmt (old_stmt, stmt)) if (maybe_clean_or_replace_eh_stmt (old_stmt, stmt))
tree_purge_dead_eh_edges (bb); tree_purge_dead_eh_edges (bb);
rhs = get_rhs (stmt);
if (TREE_CODE (rhs) == ADDR_EXPR)
recompute_tree_invarant_for_addr_expr (rhs);
} }
if (dump_file && (dump_flags & TDF_DETAILS)) if (dump_file && (dump_flags & TDF_DETAILS))
......
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