diff options
author | amacleod <amacleod@138bc75d-0d04-0410-961f-82ee72b054a4> | 2006-04-27 20:22:17 +0000 |
---|---|---|
committer | amacleod <amacleod@138bc75d-0d04-0410-961f-82ee72b054a4> | 2006-04-27 20:22:17 +0000 |
commit | 09aca5bc960f760addfa6a24c162cbebfd9e367e (patch) | |
tree | 39c9b1002df8b0cd95dd8e90404343ea80786b25 /gcc/tree-ssa-dom.c | |
parent | 3de2e08eeb62519bc9d32a407a918adf87a46beb (diff) | |
download | gcc-09aca5bc960f760addfa6a24c162cbebfd9e367e.tar.gz |
Implement new immediate use iterators.
2006-04-27 Andrew MacLeod <amacleod@redhat.com>
PR tree-optimization/26854
* tree-vrp.c (remove_range_assertions): Use new Immuse iterator.
* doc/tree-ssa.texi: Update immuse iterator documentation.
* tree-ssa-math-opts.c (execute_cse_reciprocals_1): Use new iterator.
* tree-ssa-dom.c (propagate_rhs_into_lhs): Use new iterator.
* tree-flow-inline.h (end_safe_imm_use_traverse, end_safe_imm_use_p,
first_safe_imm_use, next_safe_imm_use): Remove.
(end_imm_use_stmt_p): New. Check for end of immuse stmt traversal.
(end_imm_use_stmt_traverse): New. Terminate immuse stmt traversal.
(move_use_after_head): New. Helper function to sort immuses in a stmt.
(link_use_stmts_after): New. Link all immuses in a stmt consescutively.
(first_imm_use_stmt): New. Get first stmt in an immuse list.
(next_imm_use_stmt): New. Get next stmt in an immuse list.
(first_imm_use_on_stmt): New. Get first immuse on a stmt.
(end_imm_use_on_stmt_p): New. Check for end of immuses on a stmt.
(next_imm_use_on_stmt): New. Move to next immuse on a stmt.
* tree-ssa-forwprop.c (forward_propagate_addr_expr): Use new iterator.
* lambda-code.c (lambda_loopnest_to_gcc_loopnest): Use new iterator.
(perfect_nestify): Use new iterator.
* tree-vect-transform.c (vect_create_epilog_for_reduction): Use new
iterator.
* tree-flow.h (struct immediate_use_iterator_d): Add comments.
(next_imm_name): New field in struct immediate_use_iterator_d.
(FOR_EACH_IMM_USE_SAFE, BREAK_FROM_SAFE_IMM_USE): Remove.
(FOR_EACH_IMM_USE_STMT, BREAK_FROM_IMM_USE_STMT,
FOR_EACH_IMM_USE_ON_STMT): New immediate use iterator macros.
* tree-cfg.c (replace_uses_by): Use new iterator.
* tree-ssa-threadedge.c (lhs_of_dominating_assert): Use new iterator.
* tree-ssa-operands.c (correct_use_link): Remove.
(finalize_ssa_use_ops): No longer call correct_use_link.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@113321 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-ssa-dom.c')
-rw-r--r-- | gcc/tree-ssa-dom.c | 27 |
1 files changed, 6 insertions, 21 deletions
diff --git a/gcc/tree-ssa-dom.c b/gcc/tree-ssa-dom.c index 2777d550916..431f8564bd3 100644 --- a/gcc/tree-ssa-dom.c +++ b/gcc/tree-ssa-dom.c @@ -2118,6 +2118,7 @@ propagate_rhs_into_lhs (tree stmt, tree lhs, tree rhs, bitmap interesting_names) { use_operand_p use_p; imm_use_iterator iter; + tree use_stmt; bool all = true; /* Dump details. */ @@ -2134,10 +2135,8 @@ propagate_rhs_into_lhs (tree stmt, tree lhs, tree rhs, bitmap interesting_names) /* Walk over every use of LHS and try to replace the use with RHS. At this point the only reason why such a propagation would not be successful would be if the use occurs in an ASM_EXPR. */ - repeat: - FOR_EACH_IMM_USE_SAFE (use_p, iter, lhs) + FOR_EACH_IMM_USE_STMT (use_stmt, iter, lhs) { - tree use_stmt = USE_STMT (use_p); /* It's not always safe to propagate into an ASM_EXPR. */ if (TREE_CODE (use_stmt) == ASM_EXPR @@ -2156,7 +2155,8 @@ propagate_rhs_into_lhs (tree stmt, tree lhs, tree rhs, bitmap interesting_names) } /* Propagate the RHS into this use of the LHS. */ - propagate_value (use_p, rhs); + FOR_EACH_IMM_USE_ON_STMT (use_p, iter) + propagate_value (use_p, rhs); /* Special cases to avoid useless calls into the folding routines, operand scanning, etc. @@ -2303,23 +2303,8 @@ propagate_rhs_into_lhs (tree stmt, tree lhs, tree rhs, bitmap interesting_names) } } - /* Due to a bug in the immediate use iterator code, we can - miss visiting uses in some cases when there is more than - one use in a statement. Missing a use can cause a multitude - of problems if we expected to eliminate all uses and remove - the defining statement. - - Until Andrew can fix the iterator, this hack will detect - the cases which cause us problems. Namely if ALL is set - and we still have some immediate uses, then we must have - skipped one or more in the loop above. So just re-execute - the loop. - - The maximum number of times we can re-execute the loop is - bounded by the maximum number of times a given SSA_NAME - appears in a single statement. */ - if (all && !has_zero_uses (lhs)) - goto repeat; + /* Ensure there is nothing else to do. */ + gcc_assert (all && has_zero_uses (lhs)); /* If we were able to propagate away all uses of LHS, then we can remove STMT. */ |