Parameterize LB_TUPLE_FIX_USE_PARTIAL_RETURN_CACHE

This commit is contained in:
gingerBill
2025-12-27 12:34:08 +00:00
parent edf1e183d7
commit 76dbc5dd6f
3 changed files with 11 additions and 6 deletions

View File

@@ -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"

View File

@@ -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);

View File

@@ -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);
}