aboutsummaryrefslogtreecommitdiff
path: root/src/llvm_backend_proc.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2024-07-14 14:07:36 +0100
committergingerBill <bill@gingerbill.org>2024-07-14 14:07:36 +0100
commit2e0c5fefdedbeb1d9008a6f05a5c73c9fca7602f (patch)
treebe6d91ca1fe700614ab409a87d2633e70f2d85f2 /src/llvm_backend_proc.cpp
parent6959554040d85597300ab2ce6c25852d18e61923 (diff)
Reuse the slice value too for variadic parameters (LLVM >= 13)
Diffstat (limited to 'src/llvm_backend_proc.cpp')
-rw-r--r--src/llvm_backend_proc.cpp11
1 files changed, 11 insertions, 0 deletions
diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp
index 7a895fbdd..5270d6c30 100644
--- a/src/llvm_backend_proc.cpp
+++ b/src/llvm_backend_proc.cpp
@@ -3469,7 +3469,18 @@ gb_internal lbValue lb_build_call_expr_internal(lbProcedure *p, Ast *expr) {
if (d != nullptr && slice.addr.value == nullptr) {
for (auto const &vr : d->variadic_reuses) {
if (are_types_identical(vr.slice_type, slice_type)) {
+ #if LLVM_VERSION_MAJOR >= 13
+ // NOTE(bill): No point wasting even more memory, just reuse this stack variable too
+ if (p->variadic_reuses.count > 0) {
+ slice = p->variadic_reuses[0].slice_addr;
+ } else {
+ slice = lb_add_local_generated(p, slice_type, true);
+ }
+ // NOTE(bill): Change the underlying type to match the specific type
+ slice.addr.type = alloc_type_pointer(slice_type);
+ #else
slice = lb_add_local_generated(p, slice_type, true);
+ #endif
array_add(&p->variadic_reuses, lbVariadicReuseSlices{slice_type, slice});
break;
}