aboutsummaryrefslogtreecommitdiff
path: root/src/llvm_backend_proc.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2024-07-14 12:50:33 +0100
committergingerBill <bill@gingerbill.org>2024-07-14 12:50:33 +0100
commit5027c7081e02cc208a354cbad2fbeb90ac297b03 (patch)
tree0e0a40764932c4c22c3ef91d179ee69b9ac0a3bd /src/llvm_backend_proc.cpp
parent3533094cc2fc8cae8229b9887efae4541ccd278b (diff)
Reuse slice variable for variadic parameters
Diffstat (limited to 'src/llvm_backend_proc.cpp')
-rw-r--r--src/llvm_backend_proc.cpp8
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);