summaryrefslogtreecommitdiff
path: root/main.c
diff options
context:
space:
mode:
authorWormHeamer2025-08-07 23:26:45 -0400
committerWormHeamer2025-08-07 23:26:45 -0400
commitff9dc0a669474afab22765f0daa91fe89afb40e5 (patch)
tree404cfccc8b39f506a65b00a55378d7abd41d239f /main.c
parent027b6d8f62281f5b513a2b7bfcc02ea833c2cfd2 (diff)
hopefully make multiple returns form sensible graphs
Diffstat (limited to 'main.c')
-rw-r--r--main.c28
1 files changed, 23 insertions, 5 deletions
diff --git a/main.c b/main.c
index 4a7a3d4..edeb6a5 100644
--- a/main.c
+++ b/main.c
@@ -48,8 +48,13 @@ void parse_return(Lexer *l, Proc *p) {
}
n = node_new(p, N_RETURN, p->ctrl, e);
}
- node_add(p, n, p->stop);
- p->ctrl = n;
+ n = node_peephole(n, p, l);
+ if (n->val.type.lvl != T_XCTRL) {
+ node_add(p, n, p->stop);
+ }
+ p->ctrl = node_new_lit(p, (Value) {
+ .type = { .lvl = T_XCTRL, .t = T_NONE }
+ });
}
void parse_let(Lexer *l, Proc *p) {
@@ -154,11 +159,11 @@ void parse_if(Lexer *l, Proc *p) {
if_false->val.i = 1;
if_true = node_peephole(if_true, p, l);
if_false = node_peephole(if_false, p, l);
+ node_remove(p, if_node, p->keepalive);
assert(if_true->in.len > 0);
assert(if_false->in.len > 0);
node_add(p, if_true, p->keepalive);
node_add(p, if_false, p->keepalive);
- node_remove(p, if_node, p->keepalive);
ScopeNameList scope_before = { 0 }, scope_true = { 0 }, scope_false = { 0 };
scope_collect(&p->scope, p, &scope_before, &p->arena);
if (cond->val.type.lvl == T_CONST) {
@@ -184,20 +189,26 @@ void parse_if(Lexer *l, Proc *p) {
ctrl_else = p->ctrl;
node_add(p, ctrl_else, p->keepalive);
}
+ Node *ctrl_was = p->ctrl;
+ //node_add(p, ctrl_was, p->keepalive);
+ Node *region;
if (ctrl_else) {
//assert(ctrl_if->in.len > 0);
//assert(ctrl_else->in.len > 0);
- p->ctrl = node_peephole(node_new(p, N_REGION, ctrl_if, ctrl_else), p, l);
+ region = node_new(p, N_REGION, ctrl_if, ctrl_else);
+ node_add_out(p, region, p->keepalive);
node_remove(p, ctrl_if, p->keepalive);
node_remove(p, ctrl_else, p->keepalive);
} else {
//assert(ctrl_if->in.len > 0);
//assert(if_false->in.len > 0);
- p->ctrl = node_peephole(node_new(p, N_REGION, ctrl_if, if_false), p, l);
+ region = node_new(p, N_REGION, ctrl_if, if_false);
+ node_add_out(p, region, p->keepalive);
node_remove(p, ctrl_if, p->keepalive);
assert(if_true->refs > 0);
assert(if_false->refs > 0);
}
+ p->ctrl = region;
node_remove(p, if_true, p->keepalive);
node_remove(p, if_false, p->keepalive);
//p->ctrl = node_peephole(node_new(p, N_REGION, if_true, if_false), p, l);
@@ -206,6 +217,13 @@ void parse_if(Lexer *l, Proc *p) {
scope_uncollect(&p->scope, p, &scope_true);
scope_uncollect(&p->scope, p, &scope_false);
scope_uncollect(&p->scope, p, &scope_before);
+ fprintf(stderr, "%ld\n", p->ctrl->out.len);
+ node_del_out(p->ctrl, p->keepalive);
+ assert(p->ctrl == region);
+ /* make sure we're not orphaning any phi nodes*/
+ if (p->ctrl->out.len < 1) {
+ p->ctrl = node_peephole(p->ctrl, p, l);
+ }
}
void parse_stmt(Lexer *l, Proc *p) {