summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWormHeamer2025-10-27 22:31:26 -0400
committerWormHeamer2025-10-27 22:31:26 -0400
commitc66ed677a1b25f77e776ade5e86e6be5852adec5 (patch)
treeec73f0821f88c499bcee8ede9ed14d9103eab37f
parent2624602b6936f8ea5e060928ee5a5ed3f0f3e453 (diff)
begin work on nodelists
-rw-r--r--ir.c66
-rw-r--r--main.c8
-rw-r--r--test.lang5
3 files changed, 49 insertions, 30 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);
}
diff --git a/main.c b/main.c
index 3306dc9..e1db66d 100644
--- a/main.c
+++ b/main.c
@@ -263,8 +263,8 @@ void parse_if(Lexer *l, Proc *p) {
node_remove(g, if_true, g->keepalive);
node_remove(g, if_false, g->keepalive);
assert(g->ctrl->in.len > 0);
- assert(region->in.data[0]);
- assert(region->in.data[1]);
+ assert(IN(region, 0));
+ assert(IN(region, 1));
scope_changelist_merge(&p->scope, l, &chg_if, &chg_else, region, g, &p->scratch);
scope_changelist_discard(&chg_if, g);
@@ -379,8 +379,8 @@ void proc_opt_fwd(Proc *p, Lexer *l, Node *n) {
&& IN(n,1)->op == N_PROJ
&& CTRL(IN(n,0)) == CTRL(IN(n,1))
&& CTRL(IN(n,0))->op == N_IF_ELSE) {
- assert(n->out.data[0]->op != N_PHI);
- assert(n->out.data[0]->in.data[0] == n);
+ assert(OUT(n, 0)->op != N_PHI);
+ assert(IN(OUT(n, 0), 0) == n);
Node *new_ctrl = CTRL(CTRL(CTRL(n)));
Node *out = n->out.data[0];
node_set_in(g, out, 0, new_ctrl);
diff --git a/test.lang b/test.lang
index eb4e1a3..8a000c7 100644
--- a/test.lang
+++ b/test.lang
@@ -1,3 +1,8 @@
func main(a, b i64) i64 {
+ if a < b {
+ let t = a
+ a := b
+ b := t
+ }
return a + b + 3
}