From de6ed5846892c841e115de7caad20010f1af0f8d Mon Sep 17 00:00:00 2001 From: dnovillo Date: Mon, 11 Dec 2006 20:15:53 +0000 Subject: * tree-ssa-operands.h (create_ssa_artificial_load_stmt): Rename from create_ssa_artficial_load_stmt. Update all users. * tree-into-ssa.c (register_new_def): Make static. * tree.c (is_global_var): Handle SSA_NAMEs. * tree.h (SSA_NAME_IS_DEFAULT_DEF): Define. Update all users that used to call gimple_default_def. * tree-ssa-operands.c (push_stmt_changes): New. (pop_stmt_changes): New. Update every pass that modifies statements to bracket modifications with push_stmt_changes/pop_stmt_changes. (discard_stmt_changes): New. * tree-ssa-dom.c (stmts_to_rescan): Change to stack of 'tree *' instead of 'tree'. Update all users. * tree-flow-inline.h (zero_imm_uses_p): New. (symbol_mem_tag): New. Update every function that used to access the annotation directly. (set_symbol_mem_tag): Likewise. * tree-dfa.c (dump_variable): Always show the escape mask. (mark_symbols_for_renaming): Rename from mark_new_vars_to_rename. Update all users. Only mark to rename naked symbols in real and virtual operands. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@119746 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/tree-ssa-dom.c | 57 ++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 38 insertions(+), 19 deletions(-) (limited to 'gcc/tree-ssa-dom.c') diff --git a/gcc/tree-ssa-dom.c b/gcc/tree-ssa-dom.c index dcd4b86b42a..a2d8f1fecb3 100644 --- a/gcc/tree-ssa-dom.c +++ b/gcc/tree-ssa-dom.c @@ -101,7 +101,11 @@ static VEC(tree,heap) *avail_exprs_stack; expressions are removed from AVAIL_EXPRS. Else we may change the hash code for an expression and be unable to find/remove it from AVAIL_EXPRS. */ -static VEC(tree,heap) *stmts_to_rescan; +typedef tree *tree_p; +DEF_VEC_P(tree_p); +DEF_VEC_ALLOC_P(tree_p,heap); + +static VEC(tree_p,heap) *stmts_to_rescan; /* Structure for entries in the expression hash table. @@ -247,7 +251,7 @@ tree_ssa_dominator_optimize (void) avail_exprs = htab_create (1024, real_avail_expr_hash, avail_expr_eq, free); avail_exprs_stack = VEC_alloc (tree, heap, 20); const_and_copies_stack = VEC_alloc (tree, heap, 20); - stmts_to_rescan = VEC_alloc (tree, heap, 20); + stmts_to_rescan = VEC_alloc (tree_p, heap, 20); need_eh_cleanup = BITMAP_ALLOC (NULL); /* Setup callbacks for the generic dominator tree walker. */ @@ -359,7 +363,7 @@ tree_ssa_dominator_optimize (void) VEC_free (tree, heap, avail_exprs_stack); VEC_free (tree, heap, const_and_copies_stack); - VEC_free (tree, heap, stmts_to_rescan); + VEC_free (tree_p, heap, stmts_to_rescan); return 0; } @@ -701,16 +705,17 @@ dom_opt_finalize_block (struct dom_walk_data *walk_data, basic_block bb) /* If we queued any statements to rescan in this block, then go ahead and rescan them now. */ - while (VEC_length (tree, stmts_to_rescan) > 0) + while (VEC_length (tree_p, stmts_to_rescan) > 0) { - tree stmt = VEC_last (tree, stmts_to_rescan); + tree *stmt_p = VEC_last (tree_p, stmts_to_rescan); + tree stmt = *stmt_p; basic_block stmt_bb = bb_for_stmt (stmt); if (stmt_bb != bb) break; - VEC_pop (tree, stmts_to_rescan); - mark_new_vars_to_rename (stmt); + VEC_pop (tree_p, stmts_to_rescan); + pop_stmt_changes (stmt_p); } } @@ -1557,9 +1562,7 @@ eliminate_redundant_computations (tree stmt) Detect and record those equivalences. */ static void -record_equivalences_from_stmt (tree stmt, - int may_optimize_p, - stmt_ann_t ann) +record_equivalences_from_stmt (tree stmt, int may_optimize_p, stmt_ann_t ann) { tree lhs = GIMPLE_STMT_OPERAND (stmt, 0); enum tree_code lhs_code = TREE_CODE (lhs); @@ -1588,6 +1591,7 @@ record_equivalences_from_stmt (tree stmt, vops and recording the result in the available expression table, we may be able to expose more redundant loads. */ if (!ann->has_volatile_ops + && stmt_references_memory_p (stmt) && (TREE_CODE (GIMPLE_STMT_OPERAND (stmt, 1)) == SSA_NAME || is_gimple_min_invariant (GIMPLE_STMT_OPERAND (stmt, 1))) && !is_gimple_reg (lhs)) @@ -1621,7 +1625,7 @@ record_equivalences_from_stmt (tree stmt, /* Build a new statement with the RHS and LHS exchanged. */ new = build2_gimple (GIMPLE_MODIFY_STMT, rhs, lhs); - create_ssa_artficial_load_stmt (new, stmt); + create_ssa_artificial_load_stmt (new, stmt); /* Finally enter the statement into the available expression table. */ @@ -1741,7 +1745,7 @@ cprop_operand (tree stmt, use_operand_p op_p) known value for that SSA_NAME (or NULL if no value is known). Propagate values from CONST_AND_COPIES into the uses, vuses and - v_may_def_ops of STMT. */ + vdef_ops of STMT. */ static bool cprop_into_stmt (tree stmt) @@ -1793,6 +1797,7 @@ optimize_stmt (struct dom_walk_data *walk_data ATTRIBUTE_UNUSED, ann = stmt_ann (stmt); opt_stats.num_stmts++; may_have_exposed_new_symbols = false; + push_stmt_changes (bsi_stmt_ptr (si)); if (dump_file && (dump_flags & TDF_DETAILS)) { @@ -1800,7 +1805,7 @@ optimize_stmt (struct dom_walk_data *walk_data ATTRIBUTE_UNUSED, print_generic_stmt (dump_file, stmt, TDF_SLIM); } - /* Const/copy propagate into USES, VUSES and the RHS of V_MAY_DEFs. */ + /* Const/copy propagate into USES, VUSES and the RHS of VDEFs. */ may_have_exposed_new_symbols = cprop_into_stmt (stmt); /* If the statement has been modified with constant replacements, @@ -1856,9 +1861,7 @@ optimize_stmt (struct dom_walk_data *walk_data ATTRIBUTE_UNUSED, /* Record any additional equivalences created by this statement. */ if (TREE_CODE (stmt) == GIMPLE_MODIFY_STMT) - record_equivalences_from_stmt (stmt, - may_optimize_p, - ann); + record_equivalences_from_stmt (stmt, may_optimize_p, ann); /* If STMT is a COND_EXPR and it was modified, then we may know where it goes. If that is the case, then mark the CFG as altered. @@ -1885,7 +1888,6 @@ optimize_stmt (struct dom_walk_data *walk_data ATTRIBUTE_UNUSED, Ultimately I suspect we're going to need to change the interface into the SSA_NAME manager. */ - if (ann->modified) { tree val = NULL; @@ -1909,7 +1911,20 @@ optimize_stmt (struct dom_walk_data *walk_data ATTRIBUTE_UNUSED, } if (may_have_exposed_new_symbols) - VEC_safe_push (tree, heap, stmts_to_rescan, bsi_stmt (si)); + { + /* Queue the statement to be re-scanned after all the + AVAIL_EXPRS have been processed. The change buffer stack for + all the pushed statements will be processed when this queue + is emptied. */ + VEC_safe_push (tree_p, heap, stmts_to_rescan, bsi_stmt_ptr (si)); + } + else + { + /* Otherwise, just discard the recently pushed change buffer. If + not, the STMTS_TO_RESCAN queue will get out of synch with the + change buffer stack. */ + discard_stmt_changes (bsi_stmt_ptr (si)); + } } /* Search for an existing instance of STMT in the AVAIL_EXPRS table. If @@ -2185,6 +2200,8 @@ propagate_rhs_into_lhs (tree stmt, tree lhs, tree rhs, bitmap interesting_names) fprintf (dump_file, "\n"); } + push_stmt_changes (&use_stmt); + /* Propagate the RHS into this use of the LHS. */ FOR_EACH_IMM_USE_ON_STMT (use_p, iter) propagate_value (use_p, rhs); @@ -2219,6 +2236,8 @@ propagate_rhs_into_lhs (tree stmt, tree lhs, tree rhs, bitmap interesting_names) tree result = get_lhs_or_phi_result (use_stmt); bitmap_set_bit (interesting_names, SSA_NAME_VERSION (result)); } + + discard_stmt_changes (&use_stmt); continue; } @@ -2231,7 +2250,7 @@ propagate_rhs_into_lhs (tree stmt, tree lhs, tree rhs, bitmap interesting_names) /* Sometimes propagation can expose new operands to the renamer. Note this will call update_stmt at the appropriate time. */ - mark_new_vars_to_rename (use_stmt); + pop_stmt_changes (&use_stmt); /* Dump details. */ if (dump_file && (dump_flags & TDF_DETAILS)) -- cgit v1.2.1