gcc/ * ssa-iterators.h (FOR_EACH_PHI_OR_STMT_USE): Add checked cast to gimple_phi. (FOR_EACH_PHI_OR_STMT_DEF): Likewise.
* ssa-iterators.h (single_phi_def): Require a gimple_phi. (op_iter_init_phiuse): Likewise. (op_iter_init_phidef): Likewise. * tree-ssa-loop-im.c (extract_true_false_args_from_phi): Likewise. * tree-ssa-loop-im.c (link_use_stmts_after): Replace check against GIMPLE_PHI with add a dyn_cast to gimple_phi, using result as needed. (determine_max_movement): Likewise. * tree-ssa-reassoc.c (is_phi_for_stmt): Likewise. * tree-ssa-sccvn.c (start_over:): Likewise. * tree-ssa-loop-im.c (move_computations_dom_walker::before_dom_children): Split iterator into gimple_stmt_iterator and a gimple_phi_iterator so that a local can become a gimple_phi. --- gcc/ssa-iterators.h | 18 +++++++++++------- gcc/tree-ssa-loop-im.c | 20 +++++++++----------- gcc/tree-ssa-reassoc.c | 6 ++++-- gcc/tree-ssa-sccvn.c | 4 ++-- 4 files changed, 26 insertions(+), 22 deletions(-) diff --git a/gcc/ssa-iterators.h b/gcc/ssa-iterators.h index 126a46e..60c0461 100644 --- a/gcc/ssa-iterators.h +++ b/gcc/ssa-iterators.h @@ -194,7 +194,9 @@ struct ssa_op_iter a real stmt or a PHI node, looking at the USE nodes matching FLAGS. */ #define FOR_EACH_PHI_OR_STMT_USE(USEVAR, STMT, ITER, FLAGS) \ for ((USEVAR) = (gimple_code (STMT) == GIMPLE_PHI \ - ? op_iter_init_phiuse (&(ITER), STMT, FLAGS) \ + ? op_iter_init_phiuse (&(ITER), \ + (STMT)->as_a_gimple_phi (), \ + FLAGS) \ : op_iter_init_use (&(ITER), STMT, FLAGS)); \ !op_iter_done (&(ITER)); \ (USEVAR) = op_iter_next_use (&(ITER))) @@ -203,7 +205,9 @@ struct ssa_op_iter a real stmt or a PHI node, looking at the DEF nodes matching FLAGS. */ #define FOR_EACH_PHI_OR_STMT_DEF(DEFVAR, STMT, ITER, FLAGS) \ for ((DEFVAR) = (gimple_code (STMT) == GIMPLE_PHI \ - ? op_iter_init_phidef (&(ITER), STMT, FLAGS) \ + ? op_iter_init_phidef (&(ITER), \ + (STMT)->as_a_gimple_phi (), \ + FLAGS) \ : op_iter_init_def (&(ITER), STMT, FLAGS)); \ !op_iter_done (&(ITER)); \ (DEFVAR) = op_iter_next_def (&(ITER))) @@ -749,7 +753,7 @@ num_ssa_operands (gimple stmt, int flags) /* If there is a single DEF in the PHI node which matches FLAG, return it. Otherwise return NULL_DEF_OPERAND_P. */ static inline tree -single_phi_def (gimple stmt, int flags) +single_phi_def (gimple_phi stmt, int flags) { tree def = PHI_RESULT (stmt); if ((flags & SSA_OP_DEF) && is_gimple_reg (def)) @@ -762,7 +766,7 @@ single_phi_def (gimple stmt, int flags) /* Initialize the iterator PTR for uses matching FLAGS in PHI. FLAGS should be either SSA_OP_USES or SSA_OP_VIRTUAL_USES. */ static inline use_operand_p -op_iter_init_phiuse (ssa_op_iter *ptr, gimple phi, int flags) +op_iter_init_phiuse (ssa_op_iter *ptr, gimple_phi phi, int flags) { tree phi_def = gimple_phi_result (phi); int comp; @@ -792,7 +796,7 @@ op_iter_init_phiuse (ssa_op_iter *ptr, gimple phi, int flags) /* Start an iterator for a PHI definition. */ static inline def_operand_p -op_iter_init_phidef (ssa_op_iter *ptr, gimple phi, int flags) +op_iter_init_phidef (ssa_op_iter *ptr, gimple_phi phi, int flags) { tree phi_def = PHI_RESULT (phi); int comp; @@ -881,9 +885,9 @@ link_use_stmts_after (use_operand_p head, imm_use_iterator *imm) /* Only look at virtual or real uses, depending on the type of HEAD. */ flag = (is_gimple_reg (use) ? SSA_OP_USE : SSA_OP_VIRTUAL_USES); - if (gimple_code (head_stmt) == GIMPLE_PHI) + if (gimple_phi phi = head_stmt->dyn_cast_gimple_phi ()) { - FOR_EACH_PHI_ARG (use_p, head_stmt, op_iter, flag) + FOR_EACH_PHI_ARG (use_p, phi, op_iter, flag) if (USE_FROM_PTR (use_p) == use) last_p = move_use_after_head (use_p, head, last_p); } diff --git a/gcc/tree-ssa-loop-im.c b/gcc/tree-ssa-loop-im.c index 3a0b518..c70f32d 100644 --- a/gcc/tree-ssa-loop-im.c +++ b/gcc/tree-ssa-loop-im.c @@ -622,7 +622,7 @@ mem_ref_in_stmt (gimple stmt) else return false. */ static bool -extract_true_false_args_from_phi (basic_block dom, gimple phi, +extract_true_false_args_from_phi (basic_block dom, gimple_phi phi, tree *true_arg_p, tree *false_arg_p) { basic_block bb = gimple_bb (phi); @@ -705,7 +705,7 @@ determine_max_movement (gimple stmt, bool must_preserve_exec) level = superloop_at_depth (loop, 1); lim_data->max_loop = level; - if (gimple_code (stmt) == GIMPLE_PHI) + if (gimple_phi phi = stmt->dyn_cast_gimple_phi ()) { use_operand_p use_p; unsigned min_cost = UINT_MAX; @@ -716,7 +716,7 @@ determine_max_movement (gimple stmt, bool must_preserve_exec) evaluated. For this reason the PHI cost (and thus the cost we remove from the loop by doing the invariant motion) is that of the cheapest PHI argument dependency chain. */ - FOR_EACH_PHI_ARG (use_p, stmt, iter, SSA_OP_USE) + FOR_EACH_PHI_ARG (use_p, phi, iter, SSA_OP_USE) { val = USE_FROM_PTR (use_p); if (TREE_CODE (val) != SSA_NAME) @@ -733,7 +733,7 @@ determine_max_movement (gimple stmt, bool must_preserve_exec) lim_data->cost += min_cost; - if (gimple_phi_num_args (stmt) > 1) + if (gimple_phi_num_args (phi) > 1) { basic_block dom = get_immediate_dominator (CDI_DOMINATORS, bb); gimple cond; @@ -745,7 +745,7 @@ determine_max_movement (gimple stmt, bool must_preserve_exec) /* Verify that this is an extended form of a diamond and the PHI arguments are completely controlled by the predicate in DOM. */ - if (!extract_true_false_args_from_phi (dom, stmt, NULL, NULL)) + if (!extract_true_false_args_from_phi (dom, phi, NULL, NULL)) return false; /* Fold in dependencies and cost of the condition. */ @@ -1152,18 +1152,16 @@ void move_computations_dom_walker::before_dom_children (basic_block bb) { struct loop *level; - gimple_stmt_iterator bsi; - gimple stmt; unsigned cost = 0; struct lim_aux_data *lim_data; if (!loop_outer (bb->loop_father)) return; - for (bsi = gsi_start_phis (bb); !gsi_end_p (bsi); ) + for (gimple_phi_iterator bsi = gsi_start_phis (bb); !gsi_end_p (bsi); ) { gimple_assign new_stmt; - stmt = gsi_stmt (bsi); + gimple_phi stmt = bsi.phi (); lim_data = get_lim_data (stmt); if (lim_data == NULL) @@ -1217,11 +1215,11 @@ move_computations_dom_walker::before_dom_children (basic_block bb) remove_phi_node (&bsi, false); } - for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); ) + for (gimple_stmt_iterator bsi = gsi_start_bb (bb); !gsi_end_p (bsi); ) { edge e; - stmt = gsi_stmt (bsi); + gimple stmt = gsi_stmt (bsi); lim_data = get_lim_data (stmt); if (lim_data == NULL) diff --git a/gcc/tree-ssa-reassoc.c b/gcc/tree-ssa-reassoc.c index 47b7e8c..1c8cb2f 100644 --- a/gcc/tree-ssa-reassoc.c +++ b/gcc/tree-ssa-reassoc.c @@ -3037,6 +3037,7 @@ static bool is_phi_for_stmt (gimple stmt, tree operand) { gimple def_stmt; + gimple_phi def_phi; tree lhs; use_operand_p arg_p; ssa_op_iter i; @@ -3047,10 +3048,11 @@ is_phi_for_stmt (gimple stmt, tree operand) lhs = gimple_assign_lhs (stmt); def_stmt = SSA_NAME_DEF_STMT (operand); - if (gimple_code (def_stmt) != GIMPLE_PHI) + def_phi = def_stmt->dyn_cast_gimple_phi (); + if (!def_phi) return false; - FOR_EACH_PHI_ARG (arg_p, def_stmt, i, SSA_OP_USE) + FOR_EACH_PHI_ARG (arg_p, def_phi, i, SSA_OP_USE) if (lhs == USE_FROM_PTR (arg_p)) return true; return false; diff --git a/gcc/tree-ssa-sccvn.c b/gcc/tree-ssa-sccvn.c index 27ff70d..5d94746 100644 --- a/gcc/tree-ssa-sccvn.c +++ b/gcc/tree-ssa-sccvn.c @@ -3859,8 +3859,8 @@ start_over: if (!gimple_nop_p (defstmt)) { /* Push a new iterator. */ - if (gimple_code (defstmt) == GIMPLE_PHI) - usep = op_iter_init_phiuse (&iter, defstmt, SSA_OP_ALL_USES); + if (gimple_phi phi = defstmt->dyn_cast_gimple_phi ()) + usep = op_iter_init_phiuse (&iter, phi, SSA_OP_ALL_USES); else usep = op_iter_init_use (&iter, defstmt, SSA_OP_ALL_USES); } -- 1.8.5.3