From 89bc739611419ba52a6e6e692e9fd965ffa7d837 Mon Sep 17 00:00:00 2001 From: WormHeamer Date: Tue, 28 Oct 2025 02:08:59 -0400 Subject: remove Node.refs --- ir.c | 33 +++++++++++++++++++++++---------- 1 file changed, 23 insertions(+), 10 deletions(-) (limited to 'ir.c') diff --git a/ir.c b/ir.c index a91db1b..356a606 100644 --- a/ir.c +++ b/ir.c @@ -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); } -- cgit v1.2.3