]> git.mdlowis.com Git - proto/obnc.git/commitdiff
implemented basic ssa without phis. phis will come next
authorMichael D. Lowis <mike@mdlowis.com>
Sat, 24 Jul 2021 03:45:56 +0000 (23:45 -0400)
committerMichael D. Lowis <mike@mdlowis.com>
Sat, 24 Jul 2021 03:45:56 +0000 (23:45 -0400)
cerise/inc/cerise.h
cerise/src/ssa.c
cerise/tests/Module.m

index d5d24c38a0f87d7845decd3fbd8603a7428f4f4d..2dc7dc9a3197c246f4ad287cbe0c445111e07a64 100644 (file)
@@ -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 {
index 3294b7c76bc2994143ab98d59a48e5aebfeef7b9..0612aed9a3f1dcb37c2b97927304331c115d19f3 100644 (file)
@@ -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
             {
index 327f80f5d7358d402207acbe677682fa1670c915..150d972d1c4142a763a2e8a4080af6471b192944 100644 (file)
@@ -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;