aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorgingerBill <gingerBill@users.noreply.github.com>2025-09-28 23:32:37 +0100
committergingerBill <gingerBill@users.noreply.github.com>2025-09-28 23:32:37 +0100
commitdd15a5bc8e546177f5a7ac89df464c3ed1e9c305 (patch)
tree28822bae3e758485addc8c2d87b23f038ba8dcfb /src
parent6db8943efabf0f7569a5fcea069e84e77d7ad3ce (diff)
Do not need an extra local copy for the slices
Diffstat (limited to 'src')
-rw-r--r--src/llvm_backend_const.cpp27
1 files changed, 18 insertions, 9 deletions
diff --git a/src/llvm_backend_const.cpp b/src/llvm_backend_const.cpp
index f7a3a5f7a..cde610cc8 100644
--- a/src/llvm_backend_const.cpp
+++ b/src/llvm_backend_const.cpp
@@ -785,7 +785,7 @@ gb_internal lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, lb
GB_ASSERT(is_type_slice(type));
res.value = lb_find_or_add_entity_string16_slice_with_type(m, value.value_string16, original_type).value;
return res;
- }else {
+ } else {
ast_node(cl, CompoundLit, value.value_compound);
isize count = cl->elems.count;
@@ -808,16 +808,25 @@ gb_internal lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, lb
unsigned alignment = cast(unsigned)gb_max(type_align_of(t), 16);
- LLVMValueRef local_copy = llvm_alloca(p, LLVMTypeOf(backing_array.value), alignment);
- LLVMBuildStore(p->builder, backing_array.value, local_copy);
- array_data = llvm_alloca(p, llvm_type, alignment);
+ bool do_local_copy = false;
+ if (do_local_copy) {
+ array_data = llvm_alloca(p, llvm_type, alignment);
+
+ LLVMValueRef local_copy = llvm_alloca(p, LLVMTypeOf(backing_array.value), alignment);
+ LLVMBuildStore(p->builder, backing_array.value, local_copy);
- LLVMBuildMemCpy(p->builder,
- array_data, alignment,
- local_copy, alignment,
- LLVMConstInt(lb_type(m, t_int), type_size_of(t), false)
- );
+ LLVMBuildMemCpy(p->builder,
+ array_data, alignment,
+ local_copy, alignment,
+ LLVMConstInt(lb_type(m, t_int), type_size_of(t), false)
+ );
+ } else {
+ array_data = llvm_alloca(p, LLVMTypeOf(backing_array.value), alignment);
+ LLVMBuildStore(p->builder, backing_array.value, array_data);
+
+ array_data = LLVMBuildPointerCast(p->builder, array_data, LLVMPointerType(llvm_type, 0), "");
+ }
{