aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgingerBill <gingerBill@users.noreply.github.com>2025-12-27 12:34:08 +0000
committergingerBill <gingerBill@users.noreply.github.com>2025-12-27 12:34:08 +0000
commit76dbc5dd6fd669414986daed5f3fad7bea69408b (patch)
tree62ec9969b9763b172273174a72ccc50f708b889f
parentedf1e183d707ecb3c315d0b87f8fc6e0f6b925c4 (diff)
Parameterize `LB_TUPLE_FIX_USE_PARTIAL_RETURN_CACHE`bill/shared-partial-return-memory
-rw-r--r--src/llvm_backend.cpp1
-rw-r--r--src/llvm_backend_proc.cpp2
-rw-r--r--src/llvm_backend_utility.cpp14
3 files changed, 11 insertions, 6 deletions
diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp
index 1cde65640..aa133382e 100644
--- a/src/llvm_backend.cpp
+++ b/src/llvm_backend.cpp
@@ -17,6 +17,7 @@
#define LLVM_SET_INTERNAL_WEAK_LINKAGE(value) LLVMSetLinkage(value, USE_SEPARATE_MODULES ? LLVMWeakAnyLinkage : LLVMInternalLinkage);
+#define LB_TUPLE_FIX_USE_PARTIAL_RETURN_CACHE true
#include "llvm_backend.hpp"
#include "llvm_abi.cpp"
diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp
index fc2497a70..100d70b67 100644
--- a/src/llvm_backend_proc.cpp
+++ b/src/llvm_backend_proc.cpp
@@ -1196,7 +1196,7 @@ gb_internal lbValue lb_emit_call(lbProcedure *p, lbValue value, Array<lbValue> c
GB_ASSERT(rt->kind == Type_Tuple);
for (isize j = 0; j < rt->Tuple.variables.count-1; j++) {
Type *partial_return_type = rt->Tuple.variables[j]->type;
- lbValue partial_return_ptr = lb_get_partial_return_local(p, partial_return_type, &partial_return_stack, /*use_stack*/true);
+ lbValue partial_return_ptr = lb_get_partial_return_local(p, partial_return_type, &partial_return_stack, /*use_stack*/LB_TUPLE_FIX_USE_PARTIAL_RETURN_CACHE);
array_add(&processed_args, partial_return_ptr);
}
rt = reduce_tuple_to_single_type(rt->Tuple.variables[rt->Tuple.variables.count-1]->type);
diff --git a/src/llvm_backend_utility.cpp b/src/llvm_backend_utility.cpp
index 5316b9749..ad6260d01 100644
--- a/src/llvm_backend_utility.cpp
+++ b/src/llvm_backend_utility.cpp
@@ -1151,11 +1151,15 @@ gb_internal lbValue lb_emit_tuple_ep(lbProcedure *p, lbValue ptr, i32 index) {
lbValue res = tf->values[index];
GB_ASSERT(are_types_identical(res.type, result_type));
- // NOTE(bill): make an explicit copy because partial return values are sharing memory
- // See: lb_get_partial_return_local
- lbAddr addr = lb_add_local_generated(p, res.type, false);
- lb_addr_store(p, addr, res);
- return addr.addr;
+ if (LB_TUPLE_FIX_USE_PARTIAL_RETURN_CACHE) {
+ // NOTE(bill): make an explicit copy because partial return values are sharing memory
+ // See: lb_get_partial_return_local
+ lbAddr addr = lb_add_local_generated(p, res.type, false);
+ lb_addr_store(p, addr, res);
+ return addr.addr;
+ } else {
+ return lb_address_from_load_or_generate_local(p, res);
+ }
} else {
return lb_emit_struct_ep_internal(p, ptr, index, result_type);
}