@@ -5865,19 +5865,34 @@ pub const FuncGen = struct {
5865
5865
const array_ty = self .air .typeOf (bin_op .lhs );
5866
5866
const array_llvm_val = try self .resolveInst (bin_op .lhs );
5867
5867
const rhs = try self .resolveInst (bin_op .rhs );
5868
+ const array_llvm_ty = try self .dg .lowerType (array_ty );
5869
+ const elem_ty = array_ty .childType ();
5868
5870
if (isByRef (array_ty )) {
5869
- const array_llvm_ty = try self .dg .lowerType (array_ty );
5870
5871
const indices : [2 ]* llvm.Value = .{ self .context .intType (32 ).constNull (), rhs };
5871
- const elem_ptr = self .builder .buildInBoundsGEP (array_llvm_ty , array_llvm_val , & indices , indices .len , "" );
5872
- const elem_ty = array_ty .childType ();
5873
5872
if (isByRef (elem_ty )) {
5873
+ const elem_ptr = self .builder .buildInBoundsGEP (array_llvm_ty , array_llvm_val , & indices , indices .len , "" );
5874
5874
if (canElideLoad (self , body_tail ))
5875
5875
return elem_ptr ;
5876
5876
5877
5877
const target = self .dg .module .getTarget ();
5878
5878
return self .loadByRef (elem_ptr , elem_ty , elem_ty .abiAlignment (target ), false );
5879
5879
} else {
5880
+ const lhs_index = Air .refToIndex (bin_op .lhs ).? ;
5880
5881
const elem_llvm_ty = try self .dg .lowerType (elem_ty );
5882
+ if (self .air .instructions .items (.tag )[lhs_index ] == .load ) {
5883
+ const load_data = self .air .instructions .items (.data )[lhs_index ];
5884
+ const load_ptr = load_data .ty_op .operand ;
5885
+ const load_ptr_tag = self .air .instructions .items (.tag )[Air .refToIndex (load_ptr ).? ];
5886
+ switch (load_ptr_tag ) {
5887
+ .struct_field_ptr , .struct_field_ptr_index_0 , .struct_field_ptr_index_1 , .struct_field_ptr_index_2 , .struct_field_ptr_index_3 = > {
5888
+ const load_ptr_inst = try self .resolveInst (load_ptr );
5889
+ const gep = self .builder .buildInBoundsGEP (array_llvm_ty , load_ptr_inst , & indices , indices .len , "" );
5890
+ return self .builder .buildLoad (elem_llvm_ty , gep , "" );
5891
+ },
5892
+ else = > {},
5893
+ }
5894
+ }
5895
+ const elem_ptr = self .builder .buildInBoundsGEP (array_llvm_ty , array_llvm_val , & indices , indices .len , "" );
5881
5896
return self .builder .buildLoad (elem_llvm_ty , elem_ptr , "" );
5882
5897
}
5883
5898
}
0 commit comments