- ir_edge_t *edge
- = obstack_alloc(&info->edges_obst, EDGE_SIZE);
- memset(edge, 0, EDGE_SIZE);
- edge->src = src;
- edge->pos = pos;
- edge->kind = kind;
+ ir_edge_t *edge;
+
+ if (list_empty(&info->free_edges)) {
+ edge = obstack_alloc(&info->edges_obst, EDGE_SIZE);
+ } else {
+ edge = list_entry(info->free_edges.next, ir_edge_t, list);
+ list_del(&edge->list);
+ }
+
+ edge->src = src;
+ edge->pos = pos;
+ edge->invalid = 0;
+ edge->present = 0;
+ edge->kind = kind;
+ edge->list.next = NULL;
+ edge->list.prev = NULL;
+ memset(((char*)edge) + sizeof(ir_edge_t), 0, edges_private_size);