summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ir.c28
-rw-r--r--ir.h1
-rw-r--r--test.lang8
3 files changed, 12 insertions, 25 deletions
diff --git a/ir.c b/ir.c
index c935a67..42691ee 100644
--- a/ir.c
+++ b/ir.c
@@ -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 {
diff --git a/ir.h b/ir.h
index adb1039..9c6fc0b 100644
--- a/ir.h
+++ b/ir.h
@@ -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")\
diff --git a/test.lang b/test.lang
index 5535a4e..24a931d 100644
--- a/test.lang
+++ b/test.lang
@@ -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
}