From: Michael D. Lowis Date: Sat, 24 Jul 2021 03:45:56 +0000 (-0400) Subject: implemented basic ssa without phis. phis will come next X-Git-Url: https://git.mdlowis.com/?a=commitdiff_plain;h=f2a481978e6e0e93a76d776539cf6162f73eb819;p=proto%2Fobnc.git implemented basic ssa without phis. phis will come next --- diff --git a/cerise/inc/cerise.h b/cerise/inc/cerise.h index d5d24c3..2dc7dc9 100644 --- a/cerise/inc/cerise.h +++ b/cerise/inc/cerise.h @@ -136,18 +136,9 @@ enum { MODE_CONST = 0, MODE_VAR = 1, MODE_CONTROL = 2, - MODE_UNOP = 3, MODE_BINOP = 4, -/* - MODE_UV = 3, - MODE_UC = 4, - MODE_BVV = 5, - MODE_BVC = 6, - MODE_BCV = 7, -*/ - - +// MODE_BINIMM = 5, }; typedef struct Symbol { diff --git a/cerise/src/ssa.c b/cerise/src/ssa.c index 3294b7c..0612aed 100644 --- a/cerise/src/ssa.c +++ b/cerise/src/ssa.c @@ -49,6 +49,9 @@ SsaNode* ssa_ident(Parser* p, long long index) { node = ssa_node(IDENT, MODE_VAR); node->type = sym->type; + node->loaded = 1; + node->dest.symid = index; + node->dest.symver = sym->version; node->left.var.symid = index; node->left.var.symver = sym->version; } @@ -91,12 +94,17 @@ SsaNode* ssa_op(Parser* p, int op, SsaNode* left, SsaNode* right) SsaNode* ssa_store(Parser* p, SsaNode* dest, SsaNode* value) { - assert("!stores are not implemented"); load(p, value); - load(p, dest); +// load(p, dest); SsaNode* node = ssa_node('=', MODE_VAR); node->type = dest->type; node->dest = dest->left.var; + node->left.var = value->dest; + + Symbol* sym = symbol_getbyid(p, node->dest.symid); + sym->version++; + node->dest.symver = sym->version; + ssa_block_add(p->curr_block, node); node->loaded = 1; return node; @@ -105,7 +113,7 @@ SsaNode* ssa_store(Parser* p, SsaNode* dest, SsaNode* value) SsaNode* ssa_fieldref(Parser* p, SsaNode* record, char* fname) { (void)p, (void)record, (void)fname; - assert("!record field references unimplemented"); + assert(!"record field references unimplemented"); return NULL; } @@ -143,24 +151,6 @@ SsaNode* ssa_call(SsaNode* func); void ssa_call_add(SsaBlock* call, SsaNode* arg); - - - - - - - - - - - - - - - - - - static SsaNode* binop(Parser* p, int op, SsaNode* left, SsaNode* right) { SsaNode* node = NULL; @@ -338,163 +328,18 @@ static SsaNode* load(Parser* p, SsaNode* node) // if (!node->loaded && (node->mode != MODE_CONST) && (node->mode != MODE_VAR)) if (!node->loaded) { -// if (node->dest.symid == 0) -// { -// node->dest.symver++; -// } + if (node->dest.symid == 0) + { + Symbol* sym = symbol_getbyid(p, 0); + sym->version++; + node->dest.symver = sym->version; + } ssa_block_add(p->curr_block, node); node->loaded = 1; } return node; } - - - - - - - - - - - - - - - - - -//static void print_indent(int indent, char* str) -//{ -// /* print the indent */ -// for (int i = 0; i < indent; i++) -// { -// printf(" "); -// } -// if (str) -// { -// printf("%s", str); -// } -//} -// -//static void print_opcode(SsaNode* node) -//{ -// int op = node->code; -// if (op < 256) -// { -// printf(" %c ", op); -// } -// else if (op == RETURN) -// { -// printf(" return "); -// } -// else if (op == IF) -// { -// printf("if "); -// } -// else -// { -// printf("(%d\n", op); -// } -//} -// -//static void print(Parser* p, AstNode* node, int indent) -//{ -// assert(node); -// print_indent(indent, NULL); -// -// /* now print the data */ -// switch(node->hdr.code) -// { -// case BOOL: -// printf("B:%lld", ((AstValue*)node)->val.i); -// break; -// -// case INT: -// printf("I:%lld", ((AstValue*)node)->val.i); -// break; -// -// case REAL: -// printf("R:%f", ((AstValue*)node)->val.f); -// break; -// -// case IDENT: -// { -// Symbol* s = symbol_getbyid(p, ((AstValue*)node)->val.i); -// printf("%s.%lld", s->name, ((AstValue*)node)->tag); -// } -// break; -// -// case '.': -// printf("(field-ref\n"); -// print(p, node->links[0], indent+1); -// print(p, node->links[1], indent+1); -// print_indent(indent, ")"); -// break; -// -// case '[': -// printf("(array-index\n"); -// print(p, node->links[0], indent+1); -// print(p, node->links[1], indent+1); -// print_indent(indent, ")"); -// break; -// -// case BEGIN: -// printf("(begin\n"); -// for (AstNode* curr = node->links[0]; curr; curr = curr->hdr.next) -// { -// print(p, curr, indent+1); -// } -// print_indent(indent, ")"); -// break; -// -// case CALL: -// printf("(call\n"); -// print(p, node->links[0], indent+1); -// for (AstNode* curr = node->links[1]; curr; curr = curr->hdr.next) -// { -// print(p, curr, indent+1); -// } -// print_indent(indent, ")"); -// break; -// -// case IF: -// printf("(if\n"); -// print(p, node->links[0], indent+1); -// print(p, node->links[1], indent+1); -// if (node->links[2]) -// { -// print(p, node->links[2], indent+1); -// } -// print_indent(indent, ")"); -// break; -// -// default: -// if (node->links[1]) -// { -// print_opcode(node); -// print(p, node->links[0], indent+1); -// print(p, node->links[1], indent+1); -// print_indent(indent, ")"); -// } -// else -// { -// print_opcode(node); -// print(p, node->links[0], indent+1); -// print_indent(indent, ")"); -// } -// break; -// } -// puts(""); -//} -// -//void ast_print(Parser* p, AstNode* node) -//{ -// print(p, node, 0); -//} - - static void print_ident(Parser* p, SsaVar* var) { Symbol* s = symbol_getbyid(p, var->symid); @@ -507,6 +352,43 @@ static void print_dest(Parser* p, SsaNode* node) printf(" = "); } +static void print_opcode(SsaNode* node) +{ + int op = node->code; + if (op < 256) + { + printf(" %c ", op); + } + else if (op == RETURN) + { + printf(" return "); + } + else if (op == IF) + { + printf("if "); + } + else if (op == EQ) + { + printf("=="); + } + else if (op == NEQ) + { + printf("!="); + } + else if (op == LTEQ) + { + printf("<="); + } + else if (op == GTEQ) + { + printf(">="); + } + else + { + printf("%d\n", op); + } +} + void ssa_print(Parser* p, SsaNode* expr) { (void)p; @@ -535,11 +417,14 @@ void ssa_print(Parser* p, SsaNode* expr) } else if (expr->mode == MODE_UNOP) { - printf("unary op"); + print_opcode(expr); + print_ident(p, &(expr->left.var)); } else if (expr->mode == MODE_BINOP) { - printf("binary op"); + print_ident(p, &(expr->left.var)); + print_opcode(expr); + print_ident(p, &(expr->right.var)); } else { diff --git a/cerise/tests/Module.m b/cerise/tests/Module.m index 327f80f..150d972 100644 --- a/cerise/tests/Module.m +++ b/cerise/tests/Module.m @@ -69,6 +69,11 @@ var #end begin + b = 42; + b = -b; + c = b + 1; + + # h[1].i = 42; # a = true; # a = A; @@ -80,7 +85,7 @@ begin # b = -b; # # # Arithmetic ops - c = b + 1; +# c = b + 1; # c = b - 1; # c = b * 1; # c = b / 1;