diff options
| author | WormHeamer | 2025-08-07 22:19:31 -0400 |
|---|---|---|
| committer | WormHeamer | 2025-08-07 22:19:31 -0400 |
| commit | 027b6d8f62281f5b513a2b7bfcc02ea833c2cfd2 (patch) | |
| tree | f989eac0b424d379dc542635b10837217ec3aa76 /main.c | |
| parent | 9c8861a1ad58954f40d599c83405c720e0d2e07b (diff) | |
i thiiiink if statement peepholes work now?
Diffstat (limited to 'main.c')
| -rw-r--r-- | main.c | 66 |
1 files changed, 49 insertions, 17 deletions
@@ -141,41 +141,67 @@ void parse_if(Lexer *l, Proc *p) { Node *ctrl_if = NULL, *ctrl_else = NULL; Node *if_node = node_new(p, N_IF_ELSE, p->ctrl, cond); if_node->val = (Value) { - .type = { T_TOP, T_TUPLE, NULL }, + .type = { .lvl = T_TOP, .t = T_TUPLE }, .tuple = { 0 } }; ZDA_PUSH(&p->arena, &if_node->val.tuple, (Value) { .type = { .lvl = T_CTRL, .t = T_NONE } }); ZDA_PUSH(&p->arena, &if_node->val.tuple, (Value) { .type = { .lvl = T_CTRL, .t = T_NONE } }); if_node = node_peephole(if_node, p, l); - Node *if_true = node_peephole(node_new(p, N_PROJ, if_node), p, l); - Node *if_false = node_peephole(node_new(p, N_PROJ, if_node), p, l); - ScopeNameList scope_before = { 0 }, scope_true = { 0 }, scope_false = { 0 }; + node_add(p, if_node, p->keepalive); + Node *if_true = node_new(p, N_PROJ, if_node); + Node *if_false = node_new(p, N_PROJ, if_node); if_true->val.i = 0; if_false->val.i = 1; + if_true = node_peephole(if_true, p, l); + if_false = node_peephole(if_false, p, l); + 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) { if (cond->val.i) if_false->val.type.lvl = T_XCTRL; else if_true->val.type.lvl = T_XCTRL; } - NODE_KEEP(p, cond, { - p->ctrl = if_true; - lex_expected(l, TM_LBRACE); - parse_block(l, p, &scope_true); - ctrl_if = p->ctrl; - if (l->tok == TOK_ELSE) { - NODE_KEEP(p, ctrl_if, { - p->ctrl = if_false; - lex_expect(l, TM_LBRACE); - parse_block(l, p, &scope_false); - ctrl_else = p->ctrl; - }); + p->ctrl = if_true; + fprintf(stderr, ":+ %d\n", p->ctrl->id); + //assert(if_true->in.len > 0); + lex_expected(l, TM_LBRACE); + parse_block(l, p, &scope_true); + ctrl_if = p->ctrl; + node_add(p, ctrl_if, p->keepalive); + fprintf(stderr, ":- %d\n", p->ctrl->id); + //assert(ctrl_if->in.len > 0); + if (l->tok == TOK_ELSE) { + for (int i = 0; i < scope_before.len; i++) { + scope_update(scope_find(&p->scope, scope_before.data[i].name), scope_before.data[i].node, p); } - }); + p->ctrl = if_false; + lex_expect(l, TM_LBRACE); + parse_block(l, p, &scope_false); + ctrl_else = p->ctrl; + node_add(p, ctrl_else, p->keepalive); + } 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); + 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); + node_remove(p, ctrl_if, p->keepalive); + assert(if_true->refs > 0); + assert(if_false->refs > 0); } + 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); + assert(p->ctrl->in.len > 0); merge_scope(l, p, &scope_before, &scope_true, &scope_false); scope_uncollect(&p->scope, p, &scope_true); scope_uncollect(&p->scope, p, &scope_false); @@ -434,6 +460,12 @@ void node_print(Node *n, Proc *p) { case T_BOOL: printf("\t%d [label=\"%s\"]", n->id, n->val.i ? "true" : "false"); break; + case T_NONE: + if (n->val.type.lvl == T_XCTRL) { + printf("\t%d [label=\"~ctrl\"]", n->id); + break; + } + /* fallthrough */ default: printf("\t%d [label=\"literal %d\"]", n->id, n->id); break; |
