void remove_phi_node (gimple_stmt_iterator *gsi, bool release_lhs_p) { gimple phi = gsi_stmt (*gsi); if (release_lhs_p) insert_debug_temps_for_defs (gsi); gsi_remove (gsi, false); /* If we are deleting the PHI node, then we should release the SSA_NAME node so that it can be reused. */ release_phi_node (phi); if (release_lhs_p) release_ssa_name (gimple_phi_result (phi)); }
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; }