From d0920804c35f859d2d7edc80aa53174e478f8291 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 10 Jun 2020 13:57:25 +0100 Subject: Stop statement generation after terminating instruction in current block (LLVM C API) --- src/llvm_backend.cpp | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) (limited to 'src/llvm_backend.cpp') diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index 45d1ccf52..acd2d550b 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -3878,7 +3878,32 @@ lbValue lb_emit_logical_binary_expr(lbProcedure *p, TokenKind op, Ast *left, Ast } +bool lb_is_instr_terminating(LLVMValueRef instr) { + + if (instr != nullptr) { + LLVMOpcode op = LLVMGetInstructionOpcode(instr); + switch (op) { + case LLVMRet: + case LLVMBr: + case LLVMSwitch: + case LLVMIndirectBr: + case LLVMInvoke: + case LLVMUnreachable: + case LLVMCallBr: + return true; + } + } + return false; +} + void lb_build_stmt(lbProcedure *p, Ast *node) { + if (p->curr_block != nullptr) { + LLVMValueRef last_instr = LLVMGetLastInstruction(p->curr_block->block); + if (lb_is_instr_terminating(last_instr)) { + return; + } + } + u64 prev_state_flags = p->module->state_flags; defer (p->module->state_flags = prev_state_flags); -- cgit v1.2.3