aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/codegen/llvm.zig25
1 files changed, 24 insertions, 1 deletions
diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig
index b727404bfb..e93152df02 100644
--- a/src/codegen/llvm.zig
+++ b/src/codegen/llvm.zig
@@ -5644,6 +5644,14 @@ pub const FuncGen = struct {
const base_ptr = self.builder.buildExtractValue(slice, 0, "");
const indices: [1]*llvm.Value = .{index};
const ptr = self.builder.buildInBoundsGEP(llvm_elem_ty, base_ptr, &indices, indices.len, "");
+ if (isByRef(elem_ty)) {
+ if (self.canElideLoad(body_tail))
+ return ptr;
+
+ const target = self.dg.module.getTarget();
+ return self.loadByRef(ptr, elem_ty, elem_ty.abiAlignment(target), false);
+ }
+
return self.load(ptr, slice_ty);
}
@@ -5709,6 +5717,14 @@ pub const FuncGen = struct {
const indices: [1]*llvm.Value = .{rhs};
break :ptr self.builder.buildInBoundsGEP(llvm_elem_ty, base_ptr, &indices, indices.len, "");
};
+ if (isByRef(elem_ty)) {
+ if (self.canElideLoad(body_tail))
+ return ptr;
+
+ const target = self.dg.module.getTarget();
+ return self.loadByRef(ptr, elem_ty, elem_ty.abiAlignment(target), false);
+ }
+
return self.load(ptr, ptr_ty);
}
@@ -5832,7 +5848,14 @@ pub const FuncGen = struct {
const struct_llvm_ty = try self.dg.lowerType(struct_ty);
const field_ptr = self.builder.buildStructGEP(struct_llvm_ty, struct_llvm_val, llvm_field_index, "");
const field_ptr_ty = Type.initPayload(&ptr_ty_buf.base);
- return self.load(field_ptr, field_ptr_ty);
+ if (isByRef(field_ty)) {
+ if (canElideLoad(self, body_tail))
+ return field_ptr;
+
+ return self.loadByRef(field_ptr, field_ty, ptr_ty_buf.data.alignment(target), false);
+ } else {
+ return self.load(field_ptr, field_ptr_ty);
+ }
},
.Union => {
const union_llvm_ty = try self.dg.lowerType(struct_ty);