Reuse slice variable for variadic parameters

This commit is contained in:
gingerBill
2024-07-14 12:50:33 +01:00
parent 3533094cc2
commit 5027c7081e
2 changed files with 7 additions and 2 deletions
+1
View File
@@ -299,6 +299,7 @@ enum lbProcedureFlag : u32 {
struct lbVariadicReuseData { struct lbVariadicReuseData {
Type *slice_type; Type *slice_type;
lbAddr base_array; lbAddr base_array;
lbAddr slice_addr;
}; };
struct lbProcedure { struct lbProcedure {
+6 -2
View File
@@ -3457,9 +3457,12 @@ gb_internal lbValue lb_build_call_expr_internal(lbProcedure *p, Ast *expr) {
isize slice_len = var_args.count; isize slice_len = var_args.count;
if (slice_len > 0) { if (slice_len > 0) {
lbAddr base_array = {}; lbAddr base_array = {};
lbAddr slice = {};
for (auto const &vr : p->variadic_reuses) { for (auto const &vr : p->variadic_reuses) {
if (are_types_identical(vr.slice_type, slice_type)) { if (are_types_identical(vr.slice_type, slice_type)) {
base_array = vr.base_array; base_array = vr.base_array;
slice = vr.slice_addr;
break; break;
} }
} }
@@ -3468,14 +3471,15 @@ gb_internal lbValue lb_build_call_expr_internal(lbProcedure *p, Ast *expr) {
for (auto const &vr : d->variadic_reuses) { for (auto const &vr : d->variadic_reuses) {
if (are_types_identical(vr.slice_type, slice_type)) { if (are_types_identical(vr.slice_type, slice_type)) {
base_array = lb_add_local_generated(p, alloc_type_array(elem_type, vr.max_count), true); base_array = lb_add_local_generated(p, alloc_type_array(elem_type, vr.max_count), true);
array_add(&p->variadic_reuses, lbVariadicReuseData{slice_type, base_array}); slice = lb_add_local_generated(p, slice_type, true);
array_add(&p->variadic_reuses, lbVariadicReuseData{slice_type, base_array, slice});
break; break;
} }
} }
} }
GB_ASSERT(base_array.addr.value != nullptr); GB_ASSERT(base_array.addr.value != nullptr);
GB_ASSERT(slice.addr.value != nullptr);
lbAddr slice = lb_add_local_generated(p, slice_type, true);
for (isize i = 0; i < var_args.count; i++) { for (isize i = 0; i < var_args.count; i++) {
lbValue addr = lb_emit_array_epi(p, base_array.addr, cast(i32)i); lbValue addr = lb_emit_array_epi(p, base_array.addr, cast(i32)i);