diff options
| author | Ginger Bill <bill@gingerbill.org> | 2016-11-06 21:22:05 +0000 |
|---|---|---|
| committer | Ginger Bill <bill@gingerbill.org> | 2016-11-06 21:22:05 +0000 |
| commit | 7ba0f259433a03ca930dfb55e1927ce1a0c06cf2 (patch) | |
| tree | a2a3c78ec47c25b6f880fddccca266f2b791638c /src/ssa.cpp | |
| parent | 6c2772d09338f044096240eeb01aa09d11ddda59 (diff) | |
Separate SSA opt; Basic Timings for sections only
Diffstat (limited to 'src/ssa.cpp')
| -rw-r--r-- | src/ssa.cpp | 143 |
1 files changed, 41 insertions, 102 deletions
diff --git a/src/ssa.cpp b/src/ssa.cpp index 58028850e..6d0969e46 100644 --- a/src/ssa.cpp +++ b/src/ssa.cpp @@ -19,15 +19,16 @@ struct ssaModule { // String triple; - Map<Entity *> min_dep_map; // Key: Entity * - Map<ssaValue *> values; // Key: Entity * - Map<ssaValue *> members; // Key: String - Map<String> type_names; // Key: Type * - Map<ssaDebugInfo *> debug_info; // Key: Unique pointer - i32 global_string_index; - i32 global_array_index; // For ConstantSlice - - Array<ssaValue *> procs; // NOTE(bill): Procedures to generate + Map<Entity *> min_dep_map; // Key: Entity * + Map<ssaValue *> values; // Key: Entity * + Map<ssaValue *> members; // Key: String + Map<String> type_names; // Key: Type * + Map<ssaDebugInfo *> debug_info; // Key: Unique pointer + i32 global_string_index; + i32 global_array_index; // For ConstantSlice + + Array<ssaProcedure *> procs; // NOTE(bill): All procedures with bodies + Array<ssaValue *> procs_to_generate; // NOTE(bill): Procedures to generate }; // NOTE(bill): For more info, see https://en.wikipedia.org/wiki/Dominator_(graph_theory) @@ -524,60 +525,12 @@ struct ssaDebugInfo { }; }; - - -struct ssaFileBuffer { - gbVirtualMemory vm; - isize offset; - gbFile *output; +struct ssaGen { + ssaModule module; + gbFile output_file; + b32 opt_called; }; -void ssa_file_buffer_init(ssaFileBuffer *f, gbFile *output) { - isize size = 8*gb_virtual_memory_page_size(NULL); - f->vm = gb_vm_alloc(NULL, size); - f->offset = 0; - f->output = output; -} - -void ssa_file_buffer_destroy(ssaFileBuffer *f) { - if (f->offset > 0) { - // NOTE(bill): finish writing buffered data - gb_file_write(f->output, f->vm.data, f->offset); - } - - gb_vm_free(f->vm); -} - -void ssa_file_buffer_write(ssaFileBuffer *f, void *data, isize len) { - if (len > f->vm.size) { - gb_file_write(f->output, data, len); - return; - } - - if ((f->vm.size - f->offset) < len) { - gb_file_write(f->output, f->vm.data, f->offset); - f->offset = 0; - } - u8 *cursor = cast(u8 *)f->vm.data + f->offset; - gb_memmove(cursor, data, len); - f->offset += len; -} - - -void ssa_fprintf(ssaFileBuffer *f, char *fmt, ...) { - va_list va; - va_start(va, fmt); - char buf[4096] = {}; - isize len = gb_snprintf_va(buf, gb_size_of(buf), fmt, va); - ssa_file_buffer_write(f, buf, len-1); - va_end(va); -} - - -void ssa_file_write(ssaFileBuffer *f, void *data, isize len) { - ssa_file_buffer_write(f, data, len); -} - ssaValue *ssa_lookup_member(ssaModule *m, String name) { ssaValue **v = map_get(&m->members, hash_string(name)); if (v != NULL) { @@ -3867,7 +3820,7 @@ void ssa_build_stmt(ssaProcedure *proc, AstNode *node) { ssa_module_add_value(proc->module, e, value); array_add(&proc->children, &value->Proc); - array_add(&proc->module->procs, value); + array_add(&proc->module->procs_to_generate, value); } else { auto *info = proc->module->info; @@ -4429,24 +4382,33 @@ void ssa_build_stmt(ssaProcedure *proc, AstNode *node) { - -//////////////////////////////////////////////////////////////// -// -// @Optimizations -// -//////////////////////////////////////////////////////////////// - -#include "ssa_opt.cpp" - - - //////////////////////////////////////////////////////////////// // // @Procedure // //////////////////////////////////////////////////////////////// +void ssa_number_proc_registers(ssaProcedure *proc) { + i32 reg_index = 0; + for_array(i, proc->blocks) { + ssaBlock *b = proc->blocks[i]; + b->index = i; + for_array(j, b->instrs) { + ssaValue *value = b->instrs[j]; + GB_ASSERT(value->kind == ssaValue_Instr); + ssaInstr *instr = &value->Instr; + if (ssa_instr_type(instr) == NULL) { // NOTE(bill): Ignore non-returning instructions + continue; + } + value->index = reg_index; + reg_index++; + } + } +} + void ssa_begin_procedure_body(ssaProcedure *proc) { + array_add(&proc->module->procs, proc); + array_init(&proc->blocks, heap_allocator()); array_init(&proc->defer_stmts, heap_allocator()); array_init(&proc->children, heap_allocator()); @@ -4478,24 +4440,7 @@ void ssa_end_procedure_body(ssaProcedure *proc) { proc->curr_block = proc->decl_block; ssa_emit_jump(proc, proc->entry_block); - ssa_opt_proc(proc); - -// Number registers - i32 reg_index = 0; - for_array(i, proc->blocks) { - ssaBlock *b = proc->blocks[i]; - b->index = i; - for_array(j, b->instrs) { - ssaValue *value = b->instrs[j]; - GB_ASSERT(value->kind == ssaValue_Instr); - ssaInstr *instr = &value->Instr; - if (ssa_instr_type(instr) == NULL) { // NOTE(bill): Ignore non-returning instructions - continue; - } - value->index = reg_index; - reg_index++; - } - } + ssa_number_proc_registers(proc); } @@ -4592,7 +4537,8 @@ void ssa_init_module(ssaModule *m, Checker *c) { map_init(&m->members, heap_allocator()); map_init(&m->debug_info, heap_allocator()); map_init(&m->type_names, heap_allocator()); - array_init(&m->procs, heap_allocator()); + array_init(&m->procs, heap_allocator()); + array_init(&m->procs_to_generate, heap_allocator()); // Default states m->stmt_state_flags = 0; @@ -4656,7 +4602,7 @@ void ssa_destroy_module(ssaModule *m) { map_destroy(&m->members); map_destroy(&m->type_names); map_destroy(&m->debug_info); - array_free(&m->procs); + array_free(&m->procs_to_generate); gb_arena_free(&m->arena); } @@ -4669,13 +4615,6 @@ void ssa_destroy_module(ssaModule *m) { //////////////////////////////////////////////////////////////// - -struct ssaGen { - ssaModule module; - gbFile output_file; -}; - - b32 ssa_gen_init(ssaGen *s, Checker *c) { if (global_error_collector.count != 0) { return false; @@ -5335,8 +5274,8 @@ void ssa_gen_tree(ssaGen *s) { ssa_end_procedure_body(proc); } - for_array(i, m->procs) { - ssa_build_proc(m->procs[i], m->procs[i]->Proc.parent); + for_array(i, m->procs_to_generate) { + ssa_build_proc(m->procs_to_generate[i], m->procs_to_generate[i]->Proc.parent); } // { |