diff options
author | amacleod <amacleod@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-05-03 12:19:56 +0000 |
---|---|---|
committer | amacleod <amacleod@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-05-03 12:19:56 +0000 |
commit | b66731e8c2683e73ff3e734e22cd16fe42dd367d (patch) | |
tree | 4bdcc871f23e3607a16ebf6af8f41a8854a30836 /gcc/tree-ssa-dom.c | |
parent | 27d2baef250d495b3b82b289cb7ce209462d0157 (diff) | |
download | gcc-b66731e8c2683e73ff3e734e22cd16fe42dd367d.tar.gz |
2005-05-03 Andrew MacLeod <amacleod@redhat.com>
* lambda-code.c (gcc_loop_to_lambda_loop,
lambda_loopnest_to_gcc_loopnest, phi_loop_edge_uses_def,
stmt_is_bumper_for_loop, perfect_nest_p, replace_uses_of_x_with_y): Use
generic operand interface.
* tree-data-ref.c (find_data_references_in_loop): Use generic interface.
* tree-dfa.c (collect_dfa_stats_r, mark_new_vars_to_rename): Use
generic operand interface.
* tree-flow-inline.h (delink_imm_use, link_imm_use_to_list,
link_imm_use, link_imm_use_stmt, relink_imm_use, relink_imm_use_stmt,
next_safe_imm_use, has_zero_uses, has_single_use, single_imm_use,
num_imm_uses): Use ssa_use_operand_t.
(get_def_ops, get_use_ops, get_v_may_def_ops, get_vuse_ops,
get_v_must_def_ops): Delete.
(get_def_from_ptr, get_phi_result_ptr): Get def directly now.
(get_use_op_ptr, get_def_op_ptr, get_v_may_def_result_ptr,
get_v_may_def_op_ptr, get_vuse_op_ptr, get_v_must_def_result_ptr,
get_v_must_def_kill_ptr): Delete.
(delink_stmt_imm_use): Move and use new operand interface.
(op_iter_next_use, op_iter_next_def, op_iter_next_tree, op_iter_init,
op_iter_next_tree): Use new operand implementation.
(clear_and_done_ssa_iter): New. Initialize a blank operand iterator.
(op_iter_init_use, op_iter_init_def, op_iter_init_tree): Add iterator
type check.
(op_iter_next_mustdef, op_iter_next_maydef,
op_iter_next_must_and_may_def): Delete. Replace with...
(op_iter_next_maymustdef): New. Combine must and may next operations.
(op_iter_init_maydef, op_iter_init_mustdef,
op_iter_init_must_and_may_def): Use new interface.
(single_ssa_tree_operand ): New. Process single operands only as trees.
(single_ssa_use_operand): New. Process single operands only as uses.
(single_ssa_def_operand): New. Process single operands only as defs.
(zero_ssa_operands): New. Return TRUE if there are zero operands of the
specified types.
(num_ssa_operands): New. Count the number of specified operands.
(compare_ssa_operands_equal): New. Compare two statements' operands.
(single_phi_def): New. Return true if PHI has one def of the specified
operand type.
(op_iter_init_phiuse): New. Initialize the iterator for PHI arguments.
(op_iter_init_phidef): New. Initialize the iterator for the PHI def.
* tree-flow.h (struct immediate_use_iterator_d): Use ssa_use_operand_t.
(struct stmt_ann_d): Operands field no longer require GTY().
(vn_compute, vn_lookup_or_add, vn_add, vn_lookup): Change prototype.
* tree-into-ssa.c (mark_def_sites): Use SSA_OP_VMUSTKILL.
* tree-outof-ssa.c (check_replaceable, find_replaceable_in_bb,
dump_replaceable_exprs, rewrite_trees): Use generic interface.
* tree-phinodes.c (make_phi_node, release_phi_node, resize_phi_node):
Use use_operand_p instead of ssa_imm_use_t *.
* tree-pretty-print.c (dump_vops): check if operands are active before
dumping virtual operands.
* tree-sra.c (sra_walk_function): Use ZERO_SSA_OPERANDS.
* tree-ssa-ccp.c (likely_value): Use ZERO_SSA_OPERANDS.
(ccp_fold): Use new interface.
(ccp_visit_stmt): Remove unused variables and code.
(convert_to_gimple_builtin): Insert statements before calling
mark_new_vars_to_rename.
* tree-ssa-copy.c (stmt_may_generate_copy): Use ZERO_SSA_OPERANDS.
(copy_prop_visit_cond_stmt): Use generic interface.
* tree-ssa-dom.c (struct expr_hash_elt): Use stmt pointer, not the
annotation in table.
(thread_across_edge): Use generic interface.
(initialize_hash_element): Initialzie with stmt, not annotation.
(eliminate_redundant_computations): Use generic interface.
(record_equivalences_from_stmt): Pass stmt, not annotation.
(avail_expr_hash, real_avail_expr_hash, avail_expr_eq): Use generic
interface.
* tree-ssa-dse.c (dse_optimize_stmt): Use ZERO_SSA_OPERANDS.
* tree-ssa-loop-ivopts.c (find_invariants_stmt,
find_interesting_uses_stmt, protect_loop_closed_ssa_form_use): Use
generic operand interface.
* tree-ssa-loop-niter.c (chain_of_csts_start, get_val_for): Use generic
interface.
* tree-ssa-loop-unswitch.c (tree_may_unswitch_on): Use Generic operand
Interface.
* tree-ssa-operands.c (struct opbuild_list_d): New. Operand build type.
(build_defs, build_uses, build_v_may_defs, build_vuses,
build_v_must_defs): Change type to struct opbuild_list_d.
(ops_active): New. Operands active boolean.
(operand_memory, operand_memory_index): New. Operand memory managers.
(allocate_def_optype, allocate_use_optype, allocate_v_may_def_optype,
allocate_vuse_optype, allocate_v_must_def_optype): Delete.
(free_uses, free_defs, free_vuses, free_v_may_defs, free_v_must_defs):
Change from functions to static variable list heads.
(opbuild_initialize_virtual): New. Initialize a virtual build list.
(opbuild_initialize_real): New. Initialize a virtual build list.
(opbuild_free): New. Free a build list.
(opbuild_num_elems): New. Number of items in a list.
(opbuild_append_real): New. Add a real (tree *) operand.
(opbuild_append_virtual): New. Add and sort a virtual (tree) operand.
(opbuild_first): New. Return first element index in a list.
(opbuild_next): New. Return next element in a list.
(opbuild_elem_real): New. Return real element.
(opbuild_elem_virtual): New. Return virtual element.
(opbuild_elem_uid): New. Return UID of virtual element.
(opbuild_clear): New. Reset an operand list.
(opbuild_remove_elem): New. Remove an element form a list.
(ssa_operands_active): New. Return true if operand cache is active.
(init_ssa_operands, fini_ssa_operands): Initialize new implementation.
(ssa_operand_alloc): New. Allocate memory from an operand chunk.
(correct_use_link): Use use_operand_p.
(finalize_ssa_uses, finalize_ssa_v_may_defs, finalize_ssa_defs,
finalize_ssa_vuses, finalize_ssa_v_must_defs): New implmentation.
(cleanup_v_may_defs): Use new implmentation.
(finalize_ssa_stmt_operands, start_ssa_stmt_operands): New
implementation.
(append_def, append_use, append_v_may_def, append_vuse,
append_v_must_def): Call opbuild_append routine instead of using varray.
(build_ssa_operands): Simplify to simply use stmt, don't maintain a
global parse_old_ops variable.
(free_ssa_operands): New implementation.
(update_stmt_operands): Move. Change argument to build_ssa_operands.
(copy_virtual_operands): Move. New generic implementation.
(create_ssa_artficial_load_stmt): Move. New implementation.
(swap_tree_operands): Update for new implementation.
(get_expr_operands): Add stmt parameter to calls to swap_tree_operands.
(add_call_clobber_ops, add_call_read_ops): Initialize opbuild list
rather than a varray.
(verify_imm_links): Use use_operand_p.
(dump_immediate_uses_for): If the immediate use variable is a virtual
variable, show the virtual ops in the stmt.
* tree-ssa-operands.h (def_operand_p): No longer a structure.
(NULL_DEF_OPERAND_P): Now a #define.
(def_optype_d, use_optype_d, v_def_use_operand_type, v_may_def_optype_d,
vuse_operand_type, vuse_optype_d, v_must_def_optype_d): Delete.
(def_optype_d, use_optype_d, maydef_optype_d, vuse_optype_d,
mustdef_optype_d): New. Use Linked list representation.
(SSA_OPERAND_MEMORY_SIZE): New. Size of operand memory chunk.
(struct ssa_operand_memory_d): New. Allocated Chunk node.
(struct stmt_operands_d): Change to new pointers that are not GTY.
(STMT_USE_OPS, NUM_USES, SET_USE_OP, STMT_DEF_OPS, NUM_DEFS, SET_DEF_OP,
STMT_V_MAY_DEF_OPS, NUM_V_MAY_DEFS, SET_V_MAY_DEF_RESULT,
SET_V_MAY_DEF_OP, STMT_VUSE_OPS, NUM_VUSES, SET_VUSE_OP,
STMT_V_MUST_DEF_OPS, NUM_V_MUST_DEFS, SET_V_MUST_DEF_RESULT,
SET_V_MUST_DEF_KILL): Delete.
(V_MAY_DEF_OPS, V_MAY_DEF_RESULT_PTR, V_MAY_DEF_RESULT,
V_MAY_DEF_OP_PTR, V_MAY_DEF_OP): Rename to MAYDEF_*.
(V_MUST_DEF_OPS, V_MUST_DEF_RESULT_PTR, V_MUST_DEF_RESULT,
V_MUST_DEF_KILL_PTR, V_MUST_DEF_KILL): Rename to MUSTDEF_*.
(enum ssa_op_iter_type): Operand iterator typechecking values.
(struct ssa_operand_iterator_d): Use linked lists of operands.
(SSA_OP_VMUSTDEFKILL): Rename to SSA_OP_VMUSTKILL.
(FOR_EACH_SSA_MAYDEF_OPERAND, FOR_EACH_SSA_MUSTDEF_OPERAND,
FOR_EACH_SSA_MUST_AND_MAY_DEF_OPERAND): Use op_iter_next_maymustdef.
(FOR_EACH_PHI_ARG): New. Iterate over PHI arguments.
(FOR_EACH_PHI_OR_STMT_USE): New. Iterate over PHI or stmt uses.
(FOR_EACH_PHI_OR_STMT_DEF): New. Iterate over PHI or stmt defs.
(SINGLE_SSA_TREE_OPERAND, SINGLE_SSA_USE_OPERAND,
SINGLE_SSA_DEF_OPERAND, ZERO_SSA_OPERANDS, NUM_SSA_OPERANDS): New.
* tree-ssa-opfinalize.h: New. Function templates for expansion.
(FINALIZE_ALLOC): Expands into alloc_def, alloc_use, alloc_maydef,
alloc_vuse, and alloc_mustdef.
(FINALIZE_FUNC): Expands into finalize_ssa_def_ops,
finalize_ssa_use_ops, finalize_ssa_v_may_def_ops, finalize_ssa_vuse_ops,
and finalize_ssa_v_must_def_ops.
* tree-ssa-pre.c (add_to_sets): Pass tree to vn_add.
(create_value_expr_from): Use stmt not vuse_optype as a parameter. Pass
stmt around.
(compute_avail): Use generic iterator interface.
* tree-ssa-propagate.c (first_vdef): Use generic operand interface.
(stmt_makes_single_load, stmt_makes_single_store): Use
ZERO_SSA_OPERANDS.
* tree-ssa-sink.c (is_hidden_global_store): Use ZERO_SSA_OPERANDS.
(statement_sink_location): Use generic interface.
* tree-ssa.c (verify_ssa): Use %p in fprintf. Use generic interface.
(delete_tree_ssa): Don't call release_defs. Call release_ssa_name and
reset the immediate use link nodes.
(stmt_references_memory_p): Use ZERO_SSA_OPERANDS.
* tree-ssanames.c (make_ssa_name): Use use_operand_p.
* tree-tailcall.c (find_tail_calls): Use ZERO_SSA_OPERANDS.
(eliminate_tail_call): Use generic operand interface.
* tree-vect-analyze.c (vect_analyze_data_refs): Use ZERO_SSA_OPERANDS.
(vect_mark_relevant, vect_mark_stmts_to_be_vectorized): Use generic
interface.
* tree-vect-transform.c (update_vuses_to_preheader): Use generic
interface.
* tree-vectorizer.c (rename_variables_in_bb): Use generic interface.
* tree-vn.c (struct val_expr_pair_d): Cache statment pointer instead of
vuse_optype.
(vn_compute, val_expr_pair_hash, vn_add, vn_lookup, vn_lookup_or_add):
Use statement pointer instead of vuse_optype. Use generic interface.
* tree-vrp.c (maybe_add_assert_expr): Use generic interface.
(stmt_interesting_for_vrp, vrp_visit_stmt): Use ZERO_SSA_OPERANDS.
* tree.h (struct ssa_imm_use_d): Renamed to ssa_use_operand_d.
(tree_ssa_name, phi_arg_d): Use ssa_use_operand_d.
* doc/tree-ssa.texi: Update documentation for operand interface.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@99155 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-ssa-dom.c')
-rw-r--r-- | gcc/tree-ssa-dom.c | 122 |
1 files changed, 41 insertions, 81 deletions
diff --git a/gcc/tree-ssa-dom.c b/gcc/tree-ssa-dom.c index d9edd0813ce..fa8e7d6f422 100644 --- a/gcc/tree-ssa-dom.c +++ b/gcc/tree-ssa-dom.c @@ -124,8 +124,8 @@ struct expr_hash_elt /* The expression (rhs) we want to record. */ tree rhs; - /* The annotation if this element corresponds to a statement. */ - stmt_ann_t ann; + /* The stmt pointer if this element corresponds to a statement. */ + tree stmt; /* The hash value for RHS/ann. */ hashval_t hash; @@ -675,36 +675,26 @@ thread_across_edge (struct dom_walk_data *walk_data, edge e) else { /* Copy the operands. */ - stmt_ann_t ann = stmt_ann (stmt); - use_optype uses = USE_OPS (ann); - vuse_optype vuses = VUSE_OPS (ann); - tree *uses_copy = xmalloc (NUM_USES (uses) * sizeof (tree)); - tree *vuses_copy = xmalloc (NUM_VUSES (vuses) * sizeof (tree)); - unsigned int i; + tree *copy; + ssa_op_iter iter; + use_operand_p use_p; + unsigned int num, i = 0; - /* Make a copy of the uses into USES_COPY, then cprop into - the use operands. */ - for (i = 0; i < NUM_USES (uses); i++) - { - tree tmp = NULL; + num = NUM_SSA_OPERANDS (stmt, (SSA_OP_USE | SSA_OP_VUSE)); + copy = xcalloc (num, sizeof (tree)); - uses_copy[i] = USE_OP (uses, i); - if (TREE_CODE (USE_OP (uses, i)) == SSA_NAME) - tmp = SSA_NAME_VALUE (USE_OP (uses, i)); - if (tmp && TREE_CODE (tmp) != VALUE_HANDLE) - SET_USE_OP (uses, i, tmp); - } - - /* Similarly for virtual uses. */ - for (i = 0; i < NUM_VUSES (vuses); i++) + /* Make a copy of the uses & vuses into USES_COPY, then cprop into + the operands. */ + FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_USE | SSA_OP_VUSE) { tree tmp = NULL; + tree use = USE_FROM_PTR (use_p); - vuses_copy[i] = VUSE_OP (vuses, i); - if (TREE_CODE (VUSE_OP (vuses, i)) == SSA_NAME) - tmp = SSA_NAME_VALUE (VUSE_OP (vuses, i)); + copy[i++] = use; + if (TREE_CODE (use) == SSA_NAME) + tmp = SSA_NAME_VALUE (use); if (tmp && TREE_CODE (tmp) != VALUE_HANDLE) - SET_VUSE_OP (vuses, i, tmp); + SET_USE (use_p, tmp); } /* Try to fold/lookup the new expression. Inserting the @@ -715,15 +705,13 @@ thread_across_edge (struct dom_walk_data *walk_data, edge e) && !is_gimple_min_invariant (cached_lhs)) cached_lhs = lookup_avail_expr (stmt, false); - /* Restore the statement's original uses/defs. */ - for (i = 0; i < NUM_USES (uses); i++) - SET_USE_OP (uses, i, uses_copy[i]); - for (i = 0; i < NUM_VUSES (vuses); i++) - SET_VUSE_OP (vuses, i, vuses_copy[i]); + /* Restore the statement's original uses/defs. */ + i = 0; + FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_USE | SSA_OP_VUSE) + SET_USE (use_p, copy[i++]); - free (uses_copy); - free (vuses_copy); + free (copy); } /* Record the context sensitive equivalence if we were able @@ -885,32 +873,32 @@ initialize_hash_element (tree expr, tree lhs, struct expr_hash_elt *element) we want to record the expression the statement evaluates. */ if (COMPARISON_CLASS_P (expr) || TREE_CODE (expr) == TRUTH_NOT_EXPR) { - element->ann = NULL; + element->stmt = NULL; element->rhs = expr; } else if (TREE_CODE (expr) == COND_EXPR) { - element->ann = stmt_ann (expr); + element->stmt = expr; element->rhs = COND_EXPR_COND (expr); } else if (TREE_CODE (expr) == SWITCH_EXPR) { - element->ann = stmt_ann (expr); + element->stmt = expr; element->rhs = SWITCH_COND (expr); } else if (TREE_CODE (expr) == RETURN_EXPR && TREE_OPERAND (expr, 0)) { - element->ann = stmt_ann (expr); + element->stmt = expr; element->rhs = TREE_OPERAND (TREE_OPERAND (expr, 0), 1); } else if (TREE_CODE (expr) == GOTO_EXPR) { - element->ann = stmt_ann (expr); + element->stmt = expr; element->rhs = GOTO_DESTINATION (expr); } else { - element->ann = stmt_ann (expr); + element->stmt = expr; element->rhs = TREE_OPERAND (expr, 1); } @@ -2608,7 +2596,6 @@ static bool eliminate_redundant_computations (struct dom_walk_data *walk_data, tree stmt, stmt_ann_t ann) { - v_may_def_optype v_may_defs = V_MAY_DEF_OPS (ann); tree *expr_p, def = NULL_TREE; bool insert = true; tree cached_lhs; @@ -2623,7 +2610,7 @@ eliminate_redundant_computations (struct dom_walk_data *walk_data, || ! def || TREE_CODE (def) != SSA_NAME || SSA_NAME_OCCURS_IN_ABNORMAL_PHI (def) - || NUM_V_MAY_DEFS (v_may_defs) != 0 + || !ZERO_SSA_OPERANDS (stmt, SSA_OP_VMAYDEF) /* Do not record equivalences for increments of ivs. This would create overlapping live ranges for a very questionable gain. */ || simple_iv_increment_p (stmt)) @@ -2804,7 +2791,7 @@ record_equivalences_from_stmt (tree stmt, /* Build a new statement with the RHS and LHS exchanged. */ new = build (MODIFY_EXPR, TREE_TYPE (stmt), rhs, lhs); - create_ssa_artficial_load_stmt (&(ann->operands), new); + create_ssa_artficial_load_stmt (new, stmt); /* Finally enter the statement into the available expression table. */ @@ -3391,11 +3378,11 @@ vrp_eq (const void *p1, const void *p2) static hashval_t avail_expr_hash (const void *p) { - stmt_ann_t ann = ((struct expr_hash_elt *)p)->ann; + tree stmt = ((struct expr_hash_elt *)p)->stmt; tree rhs = ((struct expr_hash_elt *)p)->rhs; + tree vuse; + ssa_op_iter iter; hashval_t val = 0; - size_t i; - vuse_optype vuses; /* iterative_hash_expr knows how to deal with any expression and deals with commutative operators as well, so just use it instead @@ -3405,16 +3392,15 @@ avail_expr_hash (const void *p) /* If the hash table entry is not associated with a statement, then we can just hash the expression and not worry about virtual operands and such. */ - if (!ann) + if (!stmt || !stmt_ann (stmt)) return val; /* Add the SSA version numbers of every vuse operand. This is important because compound variables like arrays are not renamed in the operands. Rather, the rename is done on the virtual variable representing all the elements of the array. */ - vuses = VUSE_OPS (ann); - for (i = 0; i < NUM_VUSES (vuses); i++) - val = iterative_hash_expr (VUSE_OP (vuses, i), val); + FOR_EACH_SSA_TREE_OPERAND (vuse, stmt, iter, SSA_OP_VUSE) + val = iterative_hash_expr (vuse, val); return val; } @@ -3428,13 +3414,13 @@ real_avail_expr_hash (const void *p) static int avail_expr_eq (const void *p1, const void *p2) { - stmt_ann_t ann1 = ((struct expr_hash_elt *)p1)->ann; + tree stmt1 = ((struct expr_hash_elt *)p1)->stmt; tree rhs1 = ((struct expr_hash_elt *)p1)->rhs; - stmt_ann_t ann2 = ((struct expr_hash_elt *)p2)->ann; + tree stmt2 = ((struct expr_hash_elt *)p2)->stmt; tree rhs2 = ((struct expr_hash_elt *)p2)->rhs; /* If they are the same physical expression, return true. */ - if (rhs1 == rhs2 && ann1 == ann2) + if (rhs1 == rhs2 && stmt1 == stmt2) return true; /* If their codes are not equal, then quit now. */ @@ -3447,36 +3433,10 @@ avail_expr_eq (const void *p1, const void *p2) || lang_hooks.types_compatible_p (TREE_TYPE (rhs1), TREE_TYPE (rhs2))) && operand_equal_p (rhs1, rhs2, OEP_PURE_SAME)) { - vuse_optype ops1 = NULL; - vuse_optype ops2 = NULL; - size_t num_ops1 = 0; - size_t num_ops2 = 0; - size_t i; - - if (ann1) - { - ops1 = VUSE_OPS (ann1); - num_ops1 = NUM_VUSES (ops1); - } - - if (ann2) - { - ops2 = VUSE_OPS (ann2); - num_ops2 = NUM_VUSES (ops2); - } - - /* If the number of virtual uses is different, then we consider - them not equal. */ - if (num_ops1 != num_ops2) - return false; - - for (i = 0; i < num_ops1; i++) - if (VUSE_OP (ops1, i) != VUSE_OP (ops2, i)) - return false; - - gcc_assert (((struct expr_hash_elt *)p1)->hash + bool ret = compare_ssa_operands_equal (stmt1, stmt2, SSA_OP_VUSE); + gcc_assert (!ret || ((struct expr_hash_elt *)p1)->hash == ((struct expr_hash_elt *)p2)->hash); - return true; + return ret; } return false; |