summaryrefslogtreecommitdiff
path: root/ir.c
diff options
context:
space:
mode:
authorWormHeamer2025-10-28 02:10:20 -0400
committerWormHeamer2025-10-28 02:10:20 -0400
commitf360f57c45073b5e9ea74da442174b53020d15ec (patch)
tree9d49d355288a2c16e7bf86692049c67bd3d30e15 /ir.c
parent70a96b84946ad994051b3a378789507e2283a6d5 (diff)
parent89bc739611419ba52a6e6e692e9fd965ffa7d837 (diff)
Merge branch 'dev'
Diffstat (limited to 'ir.c')
-rw-r--r--ir.c33
1 files changed, 23 insertions, 10 deletions
diff --git a/ir.c b/ir.c
index c4aa16f..c4115b7 100644
--- a/ir.c
+++ b/ir.c
@@ -27,7 +27,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;
}
@@ -35,7 +34,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 *));
@@ -51,7 +49,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];
@@ -73,7 +70,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;
@@ -88,14 +84,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) {
@@ -108,7 +118,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;
@@ -132,7 +141,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);
@@ -148,7 +157,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);
}