diff options
| -rw-r--r-- | ir.c | 28 | ||||
| -rw-r--r-- | ir.h | 1 | ||||
| -rw-r--r-- | test.lang | 8 |
3 files changed, 12 insertions, 25 deletions
@@ -99,29 +99,18 @@ int type_check(Node *n) { /* nodes */ const char *node_type_name(NodeType t) { - const char *names[] = { - "N/A", - "start", "if-else", "region", "phi", "stop", - "projection", - "return", - "keepalive", - "literal", - "add", "sub", "mul", "div", - "and", "or", "xor", - "lshift", "rshift", - "neg", "not", - "equal", - "not-equal", - "less", - "greater", - "less-or-equal", - "greater-or-equal", + static const char *names[] = { +#define X(n, s) s, + NODE_TYPE_LIST +#undef X }; return names[t]; } void node_die(Node *n, Proc *p) { assert(n->refs == 0); + assert(n->op != N_DEAD); + n->op = N_DEAD; n->prev_free = p->free_list; p->free_list = n; } @@ -182,6 +171,8 @@ void node_set_in(Proc *p, Node *n, int idx, Node *to) { } void node_add(Proc *p, Node *src, Node *dest) { + if (src) assert(src->op != N_DEAD); + if (dest) assert(dest->op != N_DEAD); node_add_in(p, dest, src); if (!src) return; node_add_out(p, src, dest); @@ -194,9 +185,11 @@ void node_add(Proc *p, Node *src, Node *dest) { } void node_remove(Proc *p, Node *src, Node *dest) { + assert(dest->op != N_DEAD); node_del_in(dest, src); if (dest->refs < 1) node_die(dest, p); if (src) { + assert(src->op != N_DEAD); node_del_out(src, dest); if (src->out.len < 1) node_kill(src, p); } @@ -208,6 +201,7 @@ Node *node_new_empty(Proc *p, NodeType t) { Node *n; if (p->free_list) { n = p->free_list; + assert(n->op == N_DEAD); p->free_list = n->prev_free; memset(n, 0, sizeof(Node)); } else { @@ -51,6 +51,7 @@ void type_err(struct Node *n, Lexer *l); #define NODE_TYPE_LIST\ X(NONE, "invalid node")\ + X(DEAD, "dead node")\ X(START, "start")\ X(IF_ELSE, "if-else")\ X(REGION, "region")\ @@ -3,14 +3,6 @@ func main(a, b i64) i64 { let t = a a := b b := t - } else { - a := 5 - b := 10 - if a = b { - let t = a - a := b - b := t - } } return a + b } |
