diff options
| -rw-r--r-- | ir.c | 66 | ||||
| -rw-r--r-- | main.c | 8 | ||||
| -rw-r--r-- | test.lang | 5 |
3 files changed, 49 insertions, 30 deletions
@@ -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); } @@ -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); @@ -1,3 +1,8 @@ func main(a, b i64) i64 { + if a < b { + let t = a + a := b + b := t + } return a + b + 3 } |
