]> git.mdlowis.com Git - proto/obnc.git/commitdiff
updated ssa printing logic to use bitset to avoid multiple visits
authorMichael D. Lowis <mike@mdlowis.com>
Tue, 30 Nov 2021 04:05:43 +0000 (23:05 -0500)
committerMichael D. Lowis <mike@mdlowis.com>
Tue, 30 Nov 2021 04:05:43 +0000 (23:05 -0500)
cerise/inc/cerise.h
cerise/src/bitset.c [moved from cerise/src/bitmap.c with 100% similarity]
cerise/src/ssa.c

index 427ba21fe766dd031bed1fa6f1b041f6752adc1a..bddaf0fb2b14f980101b7d2ef3a8a68e009e2fae 100644 (file)
@@ -244,7 +244,7 @@ void compile(char* fname);
 long align_item(long offset, long size);
 long size_of(Type* type);
 
-// src/bitmap.c
+// src/bitset.c
 typedef struct Bitset Bitset;
 
 Bitset* bitset_new(size_t max);
@@ -276,7 +276,7 @@ SsaNode* ssa_call(SsaNode* func);
 void ssa_call_add(SsaBlock* call, SsaNode* arg);
 
 void ssa_print(Parser* p, SsaNode* expr);
-void ssa_print_block(Parser* p, SsaBlock* block);
+void ssa_print_block(Parser* p, Bitset* set, SsaBlock* block);
 void ssa_print_graph(Parser* p, SsaBlock* block);
 
 /* Backend Code Generation and Base Type Definitions
similarity index 100%
rename from cerise/src/bitmap.c
rename to cerise/src/bitset.c
index 51f258c3bdc6cd500b7d51b42090454eb6765451..60a1897d5e51e6de169e2dda6d5c057385111f09 100644 (file)
@@ -491,7 +491,7 @@ void ssa_print(Parser* p, SsaNode* expr)
     }
 }
 
-void ssa_print_block(Parser* p, SsaBlock* block)
+void ssa_print_block(Parser* p, Bitset* set, SsaBlock* block)
 {
     /* print the phis */
     printf("L%lu:\n", block->id);
@@ -521,53 +521,61 @@ void ssa_print_block(Parser* p, SsaBlock* block)
     /* print the next node */
     if (block->links[0])
     {
-        ssa_print_block(p, block->links[0]);
+        ssa_print_block(p, set, block->links[0]);
     }
     if (block->links[1])
     {
-        ssa_print_block(p, block->links[1]);
+        ssa_print_block(p, set, block->links[1]);
     }
 }
 
-static void print_block_graph(Parser* p, SsaBlock* block)
+static void print_block_graph(Parser* p, Bitset* set, SsaBlock* block)
 {
+    if (bitset_has(set, block->id))
+    {
+        return;
+    }
+    bitset_add(set, block->id);
+
     /* print the phis */
-//    for (SsaPhi* phi = block->phis; phi; phi = phi->next)
-//    {
-//        Symbol* s = symbol_getbyid(p, phi->symid);
-//        s->version++;
-//        printf("block%lu: %s.%lu = phi(", block->id, s->name, s->version);
-//        for (SsaPhiVar* var = phi->vars; var; var = var->next)
-//        {
-//            printf("%s.%lu", s->name, var->version);
-//            if (var->next)
-//            {
-//                printf(", ");
-//            }
-//        }
-//        puts(")");
-//    }
-//    /* print the instructions */
-//    for (SsaNode* node = block->head; node; node = node->next)
-//    {
-//        printf("block%lu : ", block->id);
-//        print_dest(p, node);
-//        ssa_print(p, node);
-//        puts("");
-//    }
+    for (SsaPhi* phi = block->phis; phi; phi = phi->next)
+    {
+        Symbol* s = symbol_getbyid(p, phi->symid);
+        s->version++;
+        printf("block%lu: %s.%lu = phi(", block->id, s->name, s->version);
+        for (SsaPhiVar* var = phi->vars; var; var = var->next)
+        {
+            printf("%s.%lu", s->name, var->version);
+            if (var->next)
+            {
+                printf(", ");
+            }
+        }
+        puts(")");
+    }
+
+    /* print the instructions */
+    for (SsaNode* node = block->head; node; node = node->next)
+    {
+        printf("block%lu : ", block->id);
+        print_dest(p, node);
+        ssa_print(p, node);
+        puts("");
+    }
 
     /* print the next nodes */
     if (block->links[0])
     {
         printf("block%lu --> block%lu\n", block->id, block->links[0]->id);
-        print_block_graph(p, block->links[0]);
+        print_block_graph(p, set, block->links[0]);
     }
+
     if (block->links[1])
     {
         printf("block%lu --> block%lu\n", block->id, block->links[1]->id);
 //        if (!block->links[1]->phis)
         {
-            print_block_graph(p, block->links[1]);
+            print_block_graph(p, set, block->links[1]);
         }
     }
 }
@@ -576,6 +584,7 @@ void ssa_print_graph(Parser* p, SsaBlock* block)
 {
     printf("@startuml\n");
     printf("[*] --> block%lu\n", block->id);
-    print_block_graph(p, block);
+    Bitset* set = bitset_new(p->blockid);
+    print_block_graph(p, set, block);
     printf("@enduml\n");
 }