From bac42efdaa5e11f90eb441c5b43d037a30361df8 Mon Sep 17 00:00:00 2001 From: "Michael D. Lowis" Date: Mon, 29 Nov 2021 23:05:43 -0500 Subject: [PATCH] updated ssa printing logic to use bitset to avoid multiple visits --- cerise/inc/cerise.h | 4 +- cerise/src/{bitmap.c => bitset.c} | 0 cerise/src/ssa.c | 69 +++++++++++++++++-------------- 3 files changed, 41 insertions(+), 32 deletions(-) rename cerise/src/{bitmap.c => bitset.c} (100%) diff --git a/cerise/inc/cerise.h b/cerise/inc/cerise.h index 427ba21..bddaf0f 100644 --- a/cerise/inc/cerise.h +++ b/cerise/inc/cerise.h @@ -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 diff --git a/cerise/src/bitmap.c b/cerise/src/bitset.c similarity index 100% rename from cerise/src/bitmap.c rename to cerise/src/bitset.c diff --git a/cerise/src/ssa.c b/cerise/src/ssa.c index 51f258c..60a1897 100644 --- a/cerise/src/ssa.c +++ b/cerise/src/ssa.c @@ -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"); } -- 2.49.0