diff options
Diffstat (limited to 'src/llvm_backend.cpp')
| -rw-r--r-- | src/llvm_backend.cpp | 26 |
1 files changed, 15 insertions, 11 deletions
diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index ecdedcc9f..905eb2ebf 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -4817,6 +4817,18 @@ void lb_build_switch_stmt(lbProcedure *p, AstSwitchStmt *ss, Scope *scope) { bool default_found = false; bool is_trivial = lb_switch_stmt_can_be_trivial_jump_table(ss, &default_found); + auto body_blocks = slice_make<lbBlock *>(permanent_allocator(), body->stmts.count); + for_array(i, body->stmts) { + Ast *clause = body->stmts[i]; + ast_node(cc, CaseClause, clause); + + body_blocks[i] = lb_create_block(p, cc->list.count == 0 ? "switch.default.body" : "switch.case.body"); + if (cc->list.count == 0) { + default_block = body_blocks[i]; + } + } + + LLVMValueRef switch_instr = nullptr; if (is_trivial) { isize num_cases = 0; @@ -4826,10 +4838,6 @@ void lb_build_switch_stmt(lbProcedure *p, AstSwitchStmt *ss, Scope *scope) { num_cases += cc->list.count; } - if (default_found) { - default_block = lb_create_block(p, "switch.default.body"); - } - LLVMBasicBlockRef end_block = done->block; if (default_block) { end_block = default_block->block; @@ -4838,19 +4846,15 @@ void lb_build_switch_stmt(lbProcedure *p, AstSwitchStmt *ss, Scope *scope) { switch_instr = LLVMBuildSwitch(p->builder, tag.value, end_block, cast(unsigned)num_cases); } + for_array(i, body->stmts) { Ast *clause = body->stmts[i]; ast_node(cc, CaseClause, clause); - lbBlock *body = fall; - - if (body == nullptr) { - body = lb_create_block(p, cc->list.count == 0 ? "switch.default.body" : "switch.case.body"); - } - + lbBlock *body = body_blocks[i]; fall = done; if (i+1 < case_count) { - fall = lb_create_block(p, "switch.fall.body"); + fall = body_blocks[i+1]; } if (cc->list.count == 0) { |