aboutsummaryrefslogtreecommitdiff
path: root/src/llvm_backend.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2021-06-14 13:26:28 +0100
committergingerBill <bill@gingerbill.org>2021-06-14 13:26:28 +0100
commit4b8cbb5a3bafd193ce591ec2765ce9a0dacefb15 (patch)
treea333931bfb8adb263e9a0cd66d743e3f2ce56a8c /src/llvm_backend.cpp
parent3e7aabe6d83797f7451300a5c8e6fb4a5c1804d2 (diff)
Fix #1015
Diffstat (limited to 'src/llvm_backend.cpp')
-rw-r--r--src/llvm_backend.cpp26
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) {