static inline void disconnect_dest (edge e) { basic_block dest = e->dest; unsigned int dest_idx = e->dest_idx; VEC_unordered_remove (edge, dest->preds, dest_idx); /* If we removed an edge in the middle of the edge vector, we need to update dest_idx of the edge that moved into the "hole". */ if (dest_idx < EDGE_COUNT (dest->preds)) EDGE_PRED (dest, dest_idx)->dest_idx = dest_idx; df_mark_solutions_dirty (); }
void vec_stack_free (void *vec) { unsigned int ix; for (ix = VEC_length (void_p, stack_vecs); ix > 0; --ix) { if (VEC_index (void_p, stack_vecs, ix - 1) == vec) { VEC_unordered_remove (void_p, stack_vecs, ix - 1); return; } } /* VEC was not on the list of vecs allocated on the stack, so it must be allocated on the heap. */ vec_heap_free (vec); }
static inline void disconnect_src (edge e) { basic_block src = e->src; edge_iterator ei; edge tmp; for (ei = ei_start (src->succs); (tmp = ei_safe_edge (ei)); ) { if (tmp == e) { VEC_unordered_remove (edge, src->succs, ei.index); df_mark_solutions_dirty (); return; } else ei_next (&ei); } gcc_unreachable (); }
static void * vec_stack_o_reserve_1 (void *vec, int reserve, size_t vec_offset, size_t elt_size, bool exact MEM_STAT_DECL) { bool found; unsigned int ix; void *newvec; found = false; for (ix = VEC_length (void_p, stack_vecs); ix > 0; --ix) { if (VEC_index (void_p, stack_vecs, ix - 1) == vec) { VEC_unordered_remove (void_p, stack_vecs, ix - 1); found = true; break; } } if (!found) { /* VEC is already on the heap. */ return vec_heap_o_reserve_1 (vec, reserve, vec_offset, elt_size, exact PASS_MEM_STAT); } /* Move VEC to the heap. */ reserve += ((struct vec_prefix *) vec)->num; newvec = vec_heap_o_reserve_1 (NULL, reserve, vec_offset, elt_size, exact PASS_MEM_STAT); if (newvec && vec) { ((struct vec_prefix *) newvec)->num = ((struct vec_prefix *) vec)->num; memcpy (((struct vec_prefix *) newvec)->vec, ((struct vec_prefix *) vec)->vec, ((struct vec_prefix *) vec)->num * elt_size); } return newvec; }