| ... | @@ -5644,6 +5644,14 @@ pub const FuncGen = struct { | ... | @@ -5644,6 +5644,14 @@ pub const FuncGen = struct { |
| 5644 | const base_ptr = self.builder.buildExtractValue(slice, 0, ""); | 5644 | const base_ptr = self.builder.buildExtractValue(slice, 0, ""); |
| 5645 | const indices: [1]*llvm.Value = .{index}; | 5645 | const indices: [1]*llvm.Value = .{index}; |
| 5646 | const ptr = self.builder.buildInBoundsGEP(llvm_elem_ty, base_ptr, &indices, indices.len, ""); | 5646 | const ptr = self.builder.buildInBoundsGEP(llvm_elem_ty, base_ptr, &indices, indices.len, ""); |
| | 5647 | if (isByRef(elem_ty)) { |
| | 5648 | if (self.canElideLoad(body_tail)) |
| | 5649 | return ptr; |
| | 5650 | |
| | 5651 | const target = self.dg.module.getTarget(); |
| | 5652 | return self.loadByRef(ptr, elem_ty, elem_ty.abiAlignment(target), false); |
| | 5653 | } |
| | 5654 | |
| 5647 | return self.load(ptr, slice_ty); | 5655 | return self.load(ptr, slice_ty); |
| 5648 | } | 5656 | } |
| 5649 | | 5657 | |
| ... | @@ -5709,6 +5717,14 @@ pub const FuncGen = struct { | ... | @@ -5709,6 +5717,14 @@ pub const FuncGen = struct { |
| 5709 | const indices: [1]*llvm.Value = .{rhs}; | 5717 | const indices: [1]*llvm.Value = .{rhs}; |
| 5710 | break :ptr self.builder.buildInBoundsGEP(llvm_elem_ty, base_ptr, &indices, indices.len, ""); | 5718 | break :ptr self.builder.buildInBoundsGEP(llvm_elem_ty, base_ptr, &indices, indices.len, ""); |
| 5711 | }; | 5719 | }; |
| | 5720 | if (isByRef(elem_ty)) { |
| | 5721 | if (self.canElideLoad(body_tail)) |
| | 5722 | return ptr; |
| | 5723 | |
| | 5724 | const target = self.dg.module.getTarget(); |
| | 5725 | return self.loadByRef(ptr, elem_ty, elem_ty.abiAlignment(target), false); |
| | 5726 | } |
| | 5727 | |
| 5712 | return self.load(ptr, ptr_ty); | 5728 | return self.load(ptr, ptr_ty); |
| 5713 | } | 5729 | } |
| 5714 | | 5730 | |
| ... | @@ -5832,7 +5848,14 @@ pub const FuncGen = struct { | ... | @@ -5832,7 +5848,14 @@ pub const FuncGen = struct { |
| 5832 | const struct_llvm_ty = try self.dg.lowerType(struct_ty); | 5848 | const struct_llvm_ty = try self.dg.lowerType(struct_ty); |
| 5833 | const field_ptr = self.builder.buildStructGEP(struct_llvm_ty, struct_llvm_val, llvm_field_index, ""); | 5849 | const field_ptr = self.builder.buildStructGEP(struct_llvm_ty, struct_llvm_val, llvm_field_index, ""); |
| 5834 | const field_ptr_ty = Type.initPayload(&ptr_ty_buf.base); | 5850 | const field_ptr_ty = Type.initPayload(&ptr_ty_buf.base); |
| 5835 | return self.load(field_ptr, field_ptr_ty); | 5851 | if (isByRef(field_ty)) { |
| | 5852 | if (canElideLoad(self, body_tail)) |
| | 5853 | return field_ptr; |
| | 5854 | |
| | 5855 | return self.loadByRef(field_ptr, field_ty, ptr_ty_buf.data.alignment(target), false); |
| | 5856 | } else { |
| | 5857 | return self.load(field_ptr, field_ptr_ty); |
| | 5858 | } |
| 5836 | }, | 5859 | }, |
| 5837 | .Union => { | 5860 | .Union => { |
| 5838 | const union_llvm_ty = try self.dg.lowerType(struct_ty); | 5861 | const union_llvm_ty = try self.dg.lowerType(struct_ty); |