summaryrefslogtreecommitdiff
path: root/ir.c
diff options
context:
space:
mode:
Diffstat (limited to 'ir.c')
-rw-r--r--ir.c66
1 files changed, 40 insertions, 26 deletions
diff --git a/ir.c b/ir.c
index 12b641b..bb0b5ea 100644
--- a/ir.c
+++ b/ir.c
@@ -4,6 +4,38 @@
#include "ir.h"
#include "strio.h"
+/* node lists */
+
+void nodelist_push(NodeList *l, Node *p, Arena *a) {
+ ZDA_PUSH(a, l, p);
+}
+
+void nodelist_remove(NodeList *l, Node *p) {
+ for (int i = l->len - 1; i >= 0; i--) {
+ if (l->data[i] == p) {
+ if (p) p->refs--;
+ l->len--;
+ if (i < l->len) {
+ memmove(&l->data[i], &l->data[i + 1], sizeof(Node*) * (l->len - i));
+ }
+ break;
+ }
+ }
+}
+
+void nodelist_remove_unordered(NodeList *l, Node *p) {
+ for (int i = l->len - 1; i >= 0; i--) {
+ if (l->data[i] == p) {
+ if (p) p->refs--;
+ l->len--;
+ if (i < l->len) {
+ l->data[i] = l->data[l->len];
+ }
+ break;
+ }
+ }
+}
+
/* nodes */
const char *node_type_name(NodeType t) {
@@ -24,29 +56,11 @@ void node_die(Node *n, Graph *p) {
}
void node_del_out(Node *n, Node *p) {
- for (int i = n->out.len - 1; i >= 0; i--) {
- if (n->out.data[i] == p) {
- if (p) p->refs--;
- n->out.len--;
- if (i < n->out.len) {
- n->out.data[i] = n->out.data[n->out.len];
- }
- break;
- }
- }
+ nodelist_remove_unordered(&n->out, p);
}
void node_del_in(Node *n, Node *p) {
- for (int i = n->in.len - 1; i >= 0; i--) {
- if (n->in.data[i] == p) {
- if (p) p->refs--;
- n->in.len--;
- if (i < n->in.len) {
- memmove(&n->in.data[i], &n->in.data[i + 1], sizeof(Node*) * (n->in.len - i));
- }
- break;
- }
- }
+ nodelist_remove(&n->in, p);
}
void node_kill(Node *n, Graph *p) {
@@ -54,27 +68,27 @@ void node_kill(Node *n, Graph *p) {
/* probably this is fine */
p->ctrl = CTRL(n);
}
- while (n->refs > 0 && n->in.len > 0) node_remove(p, n->in.data[0], n);
- while (n->refs > 0 && n->out.len > 0) node_remove(p, n, n->out.data[0]);
+ 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);
}
void node_add_out(Graph *p, Node *a, Node *b) {
- ZDA_PUSH(p->pool->arena, &a->out, b);
+ nodelist_push(&a->out, b, p->pool->arena);
if (b) b->refs++;
}
void node_add_in(Graph *p, Node *a, Node *b) {
- ZDA_PUSH(p->pool->arena, &a->in, b);
+ nodelist_push(&a->in, b, p->pool->arena);
if (b) b->refs++;
}
void node_set_in(Graph *p, Node *n, int idx, Node *to) {
- Node *in = n->in.data[idx];
+ Node *in = IN(n, idx);
if (in) in->refs--;
node_add_out(p, to, n);
node_del_out(in, n);
- n->in.data[0] = to;
+ IN(n, 0) = to;
if (in->out.len < 1) node_kill(in, p);
}