From 76dbc5dd6fd669414986daed5f3fad7bea69408b Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sat, 27 Dec 2025 12:34:08 +0000 Subject: Parameterize `LB_TUPLE_FIX_USE_PARTIAL_RETURN_CACHE` --- src/llvm_backend.cpp | 1 + src/llvm_backend_proc.cpp | 2 +- src/llvm_backend_utility.cpp | 14 +++++++++----- 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 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); } -- cgit v1.2.3