diff options
| author | gingerBill <bill@gingerbill.org> | 2024-07-14 12:50:33 +0100 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2024-07-14 12:50:33 +0100 |
| commit | 5027c7081e02cc208a354cbad2fbeb90ac297b03 (patch) | |
| tree | 0e0a40764932c4c22c3ef91d179ee69b9ac0a3bd /src/llvm_backend_proc.cpp | |
| parent | 3533094cc2fc8cae8229b9887efae4541ccd278b (diff) | |
Reuse slice variable for variadic parameters
Diffstat (limited to 'src/llvm_backend_proc.cpp')
| -rw-r--r-- | src/llvm_backend_proc.cpp | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index 272ffb474..bc85b14c2 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -3457,9 +3457,12 @@ gb_internal lbValue lb_build_call_expr_internal(lbProcedure *p, Ast *expr) { isize slice_len = var_args.count; if (slice_len > 0) { lbAddr base_array = {}; + lbAddr slice = {}; + for (auto const &vr : p->variadic_reuses) { if (are_types_identical(vr.slice_type, slice_type)) { base_array = vr.base_array; + slice = vr.slice_addr; break; } } @@ -3468,14 +3471,15 @@ gb_internal lbValue lb_build_call_expr_internal(lbProcedure *p, Ast *expr) { for (auto const &vr : d->variadic_reuses) { 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); - 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; } } } 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++) { lbValue addr = lb_emit_array_epi(p, base_array.addr, cast(i32)i); |