diff options
| author | WormHeamer | 2025-10-28 02:08:59 -0400 |
|---|---|---|
| committer | WormHeamer | 2025-10-28 02:08:59 -0400 |
| commit | 89bc739611419ba52a6e6e692e9fd965ffa7d837 (patch) | |
| tree | 394480b4d33d9ca5f67ecf6476d2cb6f985e32d4 /ir.c | |
| parent | 2bbb581678fb4871a4211fc96d12fa69c110b693 (diff) | |
remove Node.refs
Diffstat (limited to 'ir.c')
| -rw-r--r-- | ir.c | 33 |
1 files changed, 23 insertions, 10 deletions
@@ -30,7 +30,6 @@ void nodelist_fit(NodeList *l, u32 sz, Arena *a) { void nodelist_push(NodeList *l, Node *n, Arena *a) { nodelist_fit(l, l->len + 1, a); Node **p = nodelist_nth(l, l->len++); - if (n) n->refs++; *p = n; } @@ -38,7 +37,6 @@ void nodelist_remove(NodeList *l, Node *n) { Node **data = nodelist_data(l); for (unsigned i = 0; i < l->len; i++) { if (data[i] == n) { - if (n) n->refs--; l->len--; if (i < l->len) { memmove(&data[i], &data[i+1], (l->len - i) * sizeof(Node *)); @@ -54,7 +52,6 @@ void nodelist_remove_unordered(NodeList *l, Node *p) { while (i) { i--; if (data[i] == p) { - if (p) p->refs--; l->len--; if (i < l->len) { data[i] = data[l->len]; @@ -76,7 +73,6 @@ const char *node_type_name(NodeType t) { } void node_die(Node *n, Graph *p) { - assert(n->refs == 0); assert(n->op != N_DEAD); n->op = N_DEAD; n->prev_free = p->pool->free_list; @@ -91,14 +87,28 @@ void node_del_in(Node *n, Node *p) { nodelist_remove(&n->in, p); } +static inline int node_should_die(Node *n) { + return n->in.len == 0 && n->out.len == 0; +} + void node_kill(Node *n, Graph *p) { if (p->ctrl == n) { /* probably this is fine */ p->ctrl = CTRL(n); } - while (n->refs > 0 && n->in.len > 0) node_remove(p, IN(n, 0), n); - while (n->refs > 0 && n->out.len > 0) node_remove(p, n, OUT(n, 0)); - assert(n->refs == 0); + for (u32 i = 0; i < n->in.len; i++) { + Node *o = IN(n, i); + if (o) { + node_del_out(o, n); + if (node_should_die(o)) node_die(o, p); + } + } + for (u32 i = 0; i < n->out.len; i++) { + Node *o = OUT(n, i); + node_del_in(o, n); + if (node_should_die(o)) node_die(o, p); + } + node_die(n, p); } void node_add_out(Graph *p, Node *a, Node *b) { @@ -111,7 +121,6 @@ void node_add_in(Graph *p, Node *a, Node *b) { void node_set_in(Graph *p, Node *n, int idx, Node *to) { Node *in = IN(n, idx); - if (in) in->refs--; node_add_out(p, to, n); node_del_out(in, n); IN(n, idx) = to; @@ -135,7 +144,7 @@ void node_add(Graph *p, Node *src, Node *dest) { void node_remove(Graph *p, Node *src, Node *dest) { assert(dest->op != N_DEAD); node_del_in(dest, src); - if (dest->refs < 1) node_die(dest, p); + if (node_should_die(dest)) node_die(dest, p); if (src) { assert(src->op != N_DEAD); node_del_out(src, dest); @@ -151,7 +160,11 @@ Node *node_new_empty(Graph *p, NodeType t) { n = p->pool->free_list; assert(n->op == N_DEAD); p->pool->free_list = n->prev_free; - memset(n, 0, sizeof(Node)); + n->in.len = 0; + n->out.len = 0; + n->walked = 0; + n->src_pos = (LexSpan) { 0 }; + n->val = (Value) { 0 }; } else { n = new(p->pool->arena, Node); } |
