bool gsi_replace (gimple_stmt_iterator *gsi, gimple *stmt, bool update_eh_info) { gimple *orig_stmt = gsi_stmt (*gsi); bool require_eh_edge_purge = false; if (stmt == orig_stmt) return false; gcc_assert (!gimple_has_lhs (orig_stmt) || !gimple_has_lhs (stmt) || gimple_get_lhs (orig_stmt) == gimple_get_lhs (stmt)); gimple_set_location (stmt, gimple_location (orig_stmt)); gimple_set_bb (stmt, gsi_bb (*gsi)); /* Preserve EH region information from the original statement, if requested by the caller. */ if (update_eh_info) require_eh_edge_purge = maybe_clean_or_replace_eh_stmt (orig_stmt, stmt); gimple_duplicate_stmt_histograms (cfun, stmt, cfun, orig_stmt); /* Free all the data flow information for ORIG_STMT. */ gimple_set_bb (orig_stmt, NULL); gimple_remove_stmt_histograms (cfun, orig_stmt); delink_stmt_imm_use (orig_stmt); gsi_set_stmt (gsi, stmt); gimple_set_modified (stmt, true); update_modified_stmt (stmt); return require_eh_edge_purge; }
static void update_bb_for_stmts (gimple_seq_node first, basic_block bb) { gimple_seq_node n; for (n = first; n; n = n->next) gimple_set_bb (n->stmt, bb); }
void set_phi_nodes (basic_block bb, gimple_seq seq) { gimple_stmt_iterator i; gcc_checking_assert (!(bb->flags & BB_RTL)); bb->il.gimple.phi_nodes = seq; if (seq) for (i = gsi_start (seq); !gsi_end_p (i); gsi_next (&i)) gimple_set_bb (gsi_stmt (i), bb); }
static void update_bb_for_stmts (gimple_seq_node first, gimple_seq_node last, basic_block bb) { gimple_seq_node n; for (n = first; n; n = n->next) { gimple_set_bb (n, bb); if (n == last) break; } }
void add_phi_node_to_bb (gimple phi, basic_block bb) { gimple_stmt_iterator gsi; /* Add the new PHI node to the list of PHI nodes for block BB. */ if (phi_nodes (bb) == NULL) set_phi_nodes (bb, gimple_seq_alloc ()); gsi = gsi_last (phi_nodes (bb)); gsi_insert_after (&gsi, phi, GSI_NEW_STMT); /* Associate BB to the PHI node. */ gimple_set_bb (phi, bb); }
void add_phi_node_to_bb (gimple phi, basic_block bb) { gimple_seq seq = phi_nodes (bb); /* Add the new PHI node to the list of PHI nodes for block BB. */ if (seq == NULL) set_phi_nodes (bb, gimple_seq_alloc_with_stmt (phi)); else { gimple_seq_add_stmt (&seq, phi); gcc_assert (seq == phi_nodes (bb)); } /* Associate BB to the PHI node. */ gimple_set_bb (phi, bb); }
bool gsi_remove (gimple_stmt_iterator *i, bool remove_permanently) { gimple_seq_node cur, next, prev; gimple *stmt = gsi_stmt (*i); bool require_eh_edge_purge = false; if (gimple_code (stmt) != GIMPLE_PHI) insert_debug_temps_for_defs (i); /* Free all the data flow information for STMT. */ gimple_set_bb (stmt, NULL); delink_stmt_imm_use (stmt); gimple_set_modified (stmt, true); if (remove_permanently) { require_eh_edge_purge = remove_stmt_from_eh_lp (stmt); gimple_remove_stmt_histograms (cfun, stmt); } /* Update the iterator and re-wire the links in I->SEQ. */ cur = i->ptr; next = cur->next; prev = cur->prev; /* See gsi_set_stmt for why we don't reset prev/next of STMT. */ if (next) /* Cur is not last. */ next->prev = prev; else if (prev->next) /* Cur is last but not first. */ gimple_seq_set_last (i->seq, prev); if (prev->next) /* Cur is not first. */ prev->next = next; else /* Cur is first. */ *i->seq = next; i->ptr = next; return require_eh_edge_purge; }