From: Michael D. Lowis Date: Tue, 1 Mar 2022 02:08:13 +0000 (-0500) Subject: checkpoint commit for coalescing constants into operations X-Git-Url: https://git.mdlowis.com/?a=commitdiff_plain;h=a3ce9e1a87d3be322af09f63ff764d0e1a1ee869;p=proto%2Fobnc.git checkpoint commit for coalescing constants into operations --- diff --git a/cerise/backend/ssa/codegen.c b/cerise/backend/ssa/codegen.c index 5056505..058f56f 100644 --- a/cerise/backend/ssa/codegen.c +++ b/cerise/backend/ssa/codegen.c @@ -165,107 +165,168 @@ static void topsort(Bitset* set, SsaBlock** sorted, SsaBlock* block) static void print_ident(Parser* p, SsaVar* var) { Symbol* s = symbol_getbyid(p, var->symid); - printf("%s.%lu", s->name, var->symver); + char* name = (s->name[0] == '$' ? "" : s->name); + bool is_global = (s->global || s->class == SYM_PROC) && (s->class != SYM_TYPE); + char scope = (is_global ? '@' : '%'); + printf("%c%s.%lu", scope, name, var->symver); } -static void print_dest(Parser* p, SsaNode* node) -{ - if (node->mode != MODE_CONTROL) - { - print_ident(p, &(node->dest)); - 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); - } -} +//static void print_dest(Parser* p, SsaNode* node) +//{ +// if (node->mode != MODE_CONTROL) +// { +// print_ident(p, &(node->dest)); +// 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 print_op(Parser* p, SsaNode* expr) +//{ +// (void)p; +// switch(expr->code) +// { +// case IDENT: +// print_ident(p, &(expr->left.var)); +// break; +// +// case BOOL: +// printf("load %%Bool, %d", ssa_asbool(expr)); +// break; +// +// case INT: +// printf("internal constant %%Int %lld", ssa_asint(expr)); +// break; +// +// case REAL: +// printf("load %%Real, %f", ssa_asreal(expr)); +// break; +// +// case IF: +// printf("if "); +// print_ident(p, &(expr->dest)); +// printf(" then block%lu else block%lu", expr->left.block->id, expr->right.block->id); +// break; +// +// case RETURN: +// printf("return "); +// print_ident(p, &(expr->dest)); +// break; +// +// default: +// if (expr->mode == MODE_VAR) +// { +// print_ident(p, &(expr->left.var)); +// } +// else if (expr->mode == MODE_UNOP) +// { +// print_opcode(expr); +// print_ident(p, &(expr->left.var)); +// } +// else if (expr->mode == MODE_BINOP) +// { +// print_ident(p, &(expr->left.var)); +// print_opcode(expr); +// print_ident(p, &(expr->right.var)); +// } +// else +// { +// printf("??? M:%d C:%d\n", expr->mode, expr->code); +// } +// break; +// } +//} +// void print_op(Parser* p, SsaNode* expr) { - (void)p; - switch(expr->code) + switch(expr->mode) { - case IDENT: - print_ident(p, &(expr->left.var)); + case MODE_CONTROL: + break; + + case MODE_UNOP: + printf(" "); + print_ident(p, &(expr->dest)); + printf(" = \n"); break; - case BOOL: - printf("(Bool)%d", ssa_asbool(expr)); + case MODE_BINOP: + printf(" "); + print_ident(p, &(expr->dest)); + printf(" = \n"); break; - case INT: - printf("(Int)%lld", ssa_asint(expr)); + case MODE_BINOP_LC: + printf(" %%"); + print_ident(p, &(expr->dest)); + printf(" = add "); + emit_type(expr->type); + print_ident(p, &(expr->dest)); + printf("\n"); break; - case REAL: - printf("(Real)%f", ssa_asreal(expr)); + case MODE_BINOP_RC: + printf(" "); + print_ident(p, &(expr->dest)); + printf(" = add "); + emit_type(expr->type); + printf(" "); + print_ident(p, &(expr->left.var)); + printf(", "); + printf("\n"); break; - case IF: - printf("if "); + case MODE_CONST: + printf(" "); print_ident(p, &(expr->dest)); - printf(" then block%lu else block%lu", expr->left.block->id, expr->right.block->id); + printf(" = \n"); break; - case RETURN: - printf("return "); + case MODE_VAR: + printf(" "); print_ident(p, &(expr->dest)); + printf(" = \n"); break; default: - if (expr->mode == MODE_VAR) - { - print_ident(p, &(expr->left.var)); - } - else if (expr->mode == MODE_UNOP) - { - print_opcode(expr); - print_ident(p, &(expr->left.var)); - } - else if (expr->mode == MODE_BINOP) - { - print_ident(p, &(expr->left.var)); - print_opcode(expr); - print_ident(p, &(expr->right.var)); - } - else - { - printf("??? M:%d C:%d\n", expr->mode, expr->code); - } + printf("OP ????\n"); break; } } @@ -282,7 +343,11 @@ void codegen_block(Parser* p, SsaBlock* block) printf("{\n"); for (SsaBlock* curr = sorted; curr; curr = curr->next) { - printf("L%lu:\n", curr->id); + if (curr->phis || curr->head) + { + printf("L%lu:\n", curr->id); + } + /* print the phis */ for (SsaPhi* phi = curr->phis; phi; phi = phi->next) { @@ -304,10 +369,7 @@ void codegen_block(Parser* p, SsaBlock* block) /* print the instructions */ for (SsaNode* node = curr->head; node; node = node->next) { - printf(" "); - print_dest(p, node); print_op(p, node); - puts(""); } } printf("}\n"); diff --git a/cerise/inc/cerise.h b/cerise/inc/cerise.h index 511d549..f5f6a52 100644 --- a/cerise/inc/cerise.h +++ b/cerise/inc/cerise.h @@ -158,12 +158,13 @@ typedef struct SsaBlock { } SsaBlock; enum { - MODE_CONST = 0, - MODE_VAR = 1, - MODE_CONTROL = 2, - MODE_UNOP = 3, - MODE_BINOP = 4, -// MODE_BINIMM = 5, + MODE_CONST = 0, + MODE_VAR = 1, + MODE_CONTROL = 2, + MODE_UNOP = 3, + MODE_BINOP = 4, + MODE_BINOP_LC = 5, + MODE_BINOP_RC = 6, }; typedef struct Symbol { diff --git a/cerise/src/grammar.c b/cerise/src/grammar.c index 8ee12e4..5709ce6 100644 --- a/cerise/src/grammar.c +++ b/cerise/src/grammar.c @@ -663,6 +663,10 @@ static void module(Parser* p) ssa_join(p); /* debug dump the result */ + printf("define void initialize()\n"); + codegen_block(p, block); + + // ssa_print_asm(p, block); } diff --git a/cerise/src/ssa.c b/cerise/src/ssa.c index ff85c45..93a3d5f 100644 --- a/cerise/src/ssa.c +++ b/cerise/src/ssa.c @@ -263,14 +263,31 @@ static SsaNode* binop(Parser* p, int op, SsaNode* left, SsaNode* right) } else { - left = load(p, left); - right = load(p, right); - node = ssa_node(op, MODE_BINOP); - node->type = left->type; - node->left.var = left->dest; - node->right.var = right->dest; + if (left->mode == MODE_CONST) + { + right = load(p, right); + node = ssa_node(op, MODE_BINOP_LC); + node->left = left->left; + node->right.var = right->dest; + } + else if (right->mode == MODE_CONST) + { + left = load(p, left); + node = ssa_node(op, MODE_BINOP_RC); + node->left.var = left->dest; + node->right = right->left; + } + else + { + left = load(p, left); + right = load(p, right); + node = ssa_node(op, MODE_BINOP); + node->left.var = left->dest; + node->right.var = right->dest; + } - /* handle comparison operators */ + /* set the result type appropriately */ + node->type = left->type; switch (op) { case EQ: diff --git a/cerise/tests/Module.m b/cerise/tests/Module.m index 61aa3c6..cd8ab33 100644 --- a/cerise/tests/Module.m +++ b/cerise/tests/Module.m @@ -71,18 +71,18 @@ begin end begin - i = 42; - b = i; - b = 1; - if c == b then - b = b - 1; - b = b - 1; - else - b = b + 1; - b = b + 1; - end - b = 4; - b = 5; +# i = 42; +# b = i; +# b = 1; +# if c == b then +# b = b - 1; +# b = b - 1; +# else +# b = b + 1; +# b = b + 1; +# end +# b = 4; +# b = 5; # b = 42; # b = -b; @@ -106,13 +106,13 @@ begin # a = A; # b = 24; # b = B; -# + # # Unary ops # b = +b; # b = -b; # # # Arithmetic ops -# c = b + 1; + c = b + 1; # c = b - 1; # c = b * 1; # c = b / 1;