aboutsummaryrefslogtreecommitdiff
path: root/src/llvm_backend_stmt.cpp
diff options
context:
space:
mode:
authorLaytan Laats <laytanlaats@hotmail.com>2024-02-21 19:42:34 +0100
committerLaytan Laats <laytanlaats@hotmail.com>2024-02-21 19:43:34 +0100
commit1fc256dd9076e1c44f1c67fd530840daa120a334 (patch)
treeffe5887e0c3740c6667eacaa52e9cecec582e0e8 /src/llvm_backend_stmt.cpp
parent41549b502b3da7fafbe8bdf79c9a7417559b12b6 (diff)
Fix divergent proc call in `defer`
Fixes #3216 Fixes #2985
Diffstat (limited to 'src/llvm_backend_stmt.cpp')
-rw-r--r--src/llvm_backend_stmt.cpp21
1 files changed, 17 insertions, 4 deletions
diff --git a/src/llvm_backend_stmt.cpp b/src/llvm_backend_stmt.cpp
index 002fef881..388b512b2 100644
--- a/src/llvm_backend_stmt.cpp
+++ b/src/llvm_backend_stmt.cpp
@@ -1843,7 +1843,11 @@ gb_internal void lb_build_return_stmt_internal(lbProcedure *p, lbValue res) {
lb_emit_defer_stmts(p, lbDeferExit_Return, nullptr);
- LLVMBuildRetVoid(p->builder);
+ // Check for terminator in the defer stmts
+ LLVMValueRef instr = LLVMGetLastInstruction(p->curr_block->block);
+ if (!lb_is_instr_terminating(instr)) {
+ LLVMBuildRetVoid(p->builder);
+ }
} else {
LLVMValueRef ret_val = res.value;
LLVMTypeRef ret_type = p->abi_function_type->ret.type;
@@ -1868,7 +1872,12 @@ gb_internal void lb_build_return_stmt_internal(lbProcedure *p, lbValue res) {
}
lb_emit_defer_stmts(p, lbDeferExit_Return, nullptr);
- LLVMBuildRet(p->builder, ret_val);
+
+ // Check for terminator in the defer stmts
+ LLVMValueRef instr = LLVMGetLastInstruction(p->curr_block->block);
+ if (!lb_is_instr_terminating(instr)) {
+ LLVMBuildRet(p->builder, ret_val);
+ }
}
}
gb_internal void lb_build_return_stmt(lbProcedure *p, Slice<Ast *> const &return_results) {
@@ -1887,8 +1896,12 @@ gb_internal void lb_build_return_stmt(lbProcedure *p, Slice<Ast *> const &return
// No return values
lb_emit_defer_stmts(p, lbDeferExit_Return, nullptr);
-
- LLVMBuildRetVoid(p->builder);
+
+ // Check for terminator in the defer stmts
+ LLVMValueRef instr = LLVMGetLastInstruction(p->curr_block->block);
+ if (!lb_is_instr_terminating(instr)) {
+ LLVMBuildRetVoid(p->builder);
+ }
return;
} else if (return_count == 1) {
Entity *e = tuple->variables[0];