static void prop_phis (basic_block b) { gimple_stmt_iterator psi; gimple_seq phis = phi_nodes (b); for (psi = gsi_start (phis); !gsi_end_p (psi); ) { gimple phi = gsi_stmt (psi); tree def = gimple_phi_result (phi), use = gimple_phi_arg_def (phi, 0); gcc_assert (gimple_phi_num_args (phi) == 1); if (!is_gimple_reg (def)) { imm_use_iterator iter; use_operand_p use_p; gimple stmt; FOR_EACH_IMM_USE_STMT (stmt, iter, def) FOR_EACH_IMM_USE_ON_STMT (use_p, iter) SET_USE (use_p, use); } else replace_uses_by (def, use); remove_phi_node (&psi, true); } }
static void remove_duplicate_close_phi (gphi *phi, gphi_iterator *gsi) { gimple *use_stmt; use_operand_p use_p; imm_use_iterator imm_iter; tree res = gimple_phi_result (phi); tree def = gimple_phi_result (gsi->phi ()); gcc_assert (same_close_phi_node (phi, gsi->phi ())); FOR_EACH_IMM_USE_STMT (use_stmt, imm_iter, def) { FOR_EACH_IMM_USE_ON_STMT (use_p, imm_iter) SET_USE (use_p, res); update_stmt (use_stmt); /* It is possible that we just created a duplicate close-phi for an already-processed containing loop. Check for this case and clean it up. */ if (gimple_code (use_stmt) == GIMPLE_PHI && gimple_phi_num_args (use_stmt) == 1) make_close_phi_nodes_unique (gimple_bb (use_stmt)); }
void unlink_stmt_vdef (gimple stmt) { use_operand_p use_p; imm_use_iterator iter; gimple use_stmt; tree vdef = gimple_vdef (stmt); if (!vdef || TREE_CODE (vdef) != SSA_NAME) return; FOR_EACH_IMM_USE_STMT (use_stmt, iter, gimple_vdef (stmt)) { FOR_EACH_IMM_USE_ON_STMT (use_p, iter) SET_USE (use_p, gimple_vuse (stmt)); }