Skip to content

Commit ea1e219

Browse files
authored
Merge pull request #29204 from zoecarver/fix/struct-offset-for-index
Use getMetadataLayout offset instead of manual gep
2 parents 3c95348 + b3a305b commit ea1e219

File tree

4 files changed

+13
-22
lines changed

4 files changed

+13
-22
lines changed

lib/IRGen/GenStruct.cpp

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -413,17 +413,14 @@ namespace {
413413
}
414414

415415
llvm::Value *getOffsetForIndex(IRGenFunction &IGF, unsigned index) override {
416-
// TODO: do this with StructMetadataLayout::getFieldOffset
417-
418-
// Get the field offset vector from the struct metadata.
416+
auto &layout =
417+
IGF.IGM.getMetadataLayout(TheStruct.getStructOrBoundGenericStruct());
418+
auto offset = layout.getFieldOffset(
419+
IGF, layout.getDecl()->getStoredProperties()[index]);
419420
llvm::Value *metadata = IGF.emitTypeMetadataRefForLayout(TheStruct);
420-
Address fieldVector = emitAddressOfFieldOffsetVector(IGF, metadata,
421-
TheStruct.getStructOrBoundGenericStruct());
422-
423-
// Grab the indexed offset.
424-
fieldVector = IGF.Builder.CreateConstArrayGEP(fieldVector, index,
425-
IGF.IGM.getPointerSize());
426-
return IGF.Builder.CreateLoad(fieldVector);
421+
auto field = IGF.emitAddressAtOffset(metadata, offset, IGF.IGM.Int32Ty,
422+
IGF.IGM.getPointerAlignment());
423+
return IGF.Builder.CreateLoad(field);
427424
}
428425

429426
MemberAccessStrategy getFieldAccessStrategy(IRGenModule &IGM,

test/IRGen/generic_structs.sil

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -160,17 +160,15 @@ entry(%0 : $*ComplexDynamic<A, B>, %1 : $*Byteful, %2 : $*A, %3 : $*B, %4 : $*Ch
160160
%a = struct_element_addr %0 : $*ComplexDynamic<A, B>, #ComplexDynamic.a2
161161

162162
// CHECK: [[METADATA:%.*]] = bitcast %swift.type* {{%.*}} to i32*
163-
// CHECK: [[FIELD_OFFSET_VECTOR:%.*]] = getelementptr inbounds i32, i32* [[METADATA]], i64 8
164-
// CHECK: [[FIELD_OFFSET_ADDR:%.*]] = getelementptr inbounds i32, i32* [[FIELD_OFFSET_VECTOR]], i32 2
163+
// CHECK: [[FIELD_OFFSET_ADDR:%.*]] = getelementptr inbounds i32, i32* [[METADATA]], i64 10
165164
// CHECK: [[FIELD_OFFSET:%.*]] = load i32, i32* [[FIELD_OFFSET_ADDR]], align 8
166165
// CHECK: [[BYTES:%.*]] = bitcast %T15generic_structs14ComplexDynamicV* %0 to i8*
167166
// CHECK: [[BYTE_OFFSET:%.*]] = getelementptr inbounds i8, i8* [[BYTES]], i32 [[FIELD_OFFSET]]
168167
// CHECK: bitcast i8* [[BYTE_OFFSET]] to %swift.opaque*
169168
%b = struct_element_addr %0 : $*ComplexDynamic<A, B>, #ComplexDynamic.b
170169

171170
// CHECK: [[METADATA:%.*]] = bitcast %swift.type* {{%.*}} to i32*
172-
// CHECK: [[FIELD_OFFSET_VECTOR:%.*]] = getelementptr inbounds i32, i32* [[METADATA]], i64 8
173-
// CHECK: [[FIELD_OFFSET_ADDR:%.*]] = getelementptr inbounds i32, i32* [[FIELD_OFFSET_VECTOR]], i32 3
171+
// CHECK: [[FIELD_OFFSET_ADDR:%.*]] = getelementptr inbounds i32, i32* [[METADATA]], i64 11
174172
// CHECK: [[FIELD_OFFSET:%.*]] = load i32, i32* [[FIELD_OFFSET_ADDR]], align 8
175173
// CHECK: [[BYTES:%.*]] = bitcast %T15generic_structs14ComplexDynamicV* %0 to i8*
176174
// CHECK: [[BYTE_OFFSET:%.*]] = getelementptr inbounds i8, i8* [[BYTES]], i32 [[FIELD_OFFSET]]
@@ -179,8 +177,7 @@ entry(%0 : $*ComplexDynamic<A, B>, %1 : $*Byteful, %2 : $*A, %3 : $*B, %4 : $*Ch
179177
%c = struct_element_addr %5 : $*SingleDynamic<B>, #SingleDynamic.x
180178

181179
// CHECK: [[METADATA:%.*]] = bitcast %swift.type* {{%.*}} to i32*
182-
// CHECK: [[FIELD_OFFSET_VECTOR:%.*]] = getelementptr inbounds i32, i32* [[METADATA]], i64 8
183-
// CHECK: [[FIELD_OFFSET_ADDR:%.*]] = getelementptr inbounds i32, i32* [[FIELD_OFFSET_VECTOR]], i32 4
180+
// CHECK: [[FIELD_OFFSET_ADDR:%.*]] = getelementptr inbounds i32, i32* [[METADATA]], i64 12
184181
// CHECK: [[FIELD_OFFSET:%.*]] = load i32, i32* [[FIELD_OFFSET_ADDR]], align 8
185182
// CHECK: [[BYTES:%.*]] = bitcast %T15generic_structs14ComplexDynamicV* %0 to i8*
186183
// CHECK: [[BYTE_OFFSET:%.*]] = getelementptr inbounds i8, i8* [[BYTES]], i32 [[FIELD_OFFSET]]

test/IRGen/generic_structs.swift

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,7 @@ public struct GenericStruct<T : Proto> {
4242
// CHECK: [[T0:%.*]] = call swiftcc %swift.metadata_response @"$s15generic_structs13GenericStructVMa"([[INT]] 0, %swift.type* %T, i8** %T.Proto)
4343
// CHECK: [[TYPE:%.*]] = extractvalue %swift.metadata_response [[T0]], 0
4444
// CHECK: [[PTR:%.*]] = bitcast %swift.type* [[TYPE]] to [[INT_32]]*
45-
// CHECK: [[FIELDOFFSETS:%.*]] = getelementptr inbounds [[INT_32]], [[INT_32]]* [[PTR]], [[INT]] [[IDX:4|8]]
46-
// CHECK: [[FIELDOFFSET:%.*]] = getelementptr inbounds [[INT_32]], [[INT_32]]* [[FIELDOFFSETS]], i32 2
45+
// CHECK: [[FIELDOFFSET:%.*]] = getelementptr inbounds [[INT_32]], [[INT_32]]* [[PTR]], [[INT]] [[IDX:6|10]]
4746
// CHECK: [[OFFSET:%.*]] = load [[INT_32]], [[INT_32]]* [[FIELDOFFSET]]
4847
// CHECK: [[ADDROFOPT:%.*]] = getelementptr inbounds i8, i8* {{.*}}, [[INT_32]] [[OFFSET]]
4948
// CHECK: [[OPTPTR:%.*]] = bitcast i8* [[ADDROFOPT]] to %TSq*

test/IRGen/struct_resilience.swift

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,7 @@ public func functionWithResilientTypesRectangle(_ r: Rectangle) {
6666
// CHECK-NEXT: [[TMP:%.*]] = call swiftcc %swift.metadata_response @"$s16resilient_struct9RectangleVMa"([[INT]] 0)
6767
// CHECK-NEXT: [[METADATA:%.*]] = extractvalue %swift.metadata_response [[TMP]], 0
6868
// CHECK-NEXT: [[METADATA_ADDR:%.*]] = bitcast %swift.type* [[METADATA]] to i32*
69-
// CHECK-NEXT: [[FIELD_OFFSET_VECTOR:%.*]] = getelementptr inbounds i32, i32* [[METADATA_ADDR]], [[INT]] [[IDX:2|4]]
70-
// CHECK-NEXT: [[FIELD_OFFSET_PTR:%.*]] = getelementptr inbounds i32, i32* [[FIELD_OFFSET_VECTOR]], i32 2
69+
// CHECK-NEXT: [[FIELD_OFFSET_PTR:%.*]] = getelementptr inbounds i32, i32* [[METADATA_ADDR]], [[INT]] [[IDX:2|4|6]]
7170
// CHECK-NEXT: [[FIELD_OFFSET:%.*]] = load i32, i32* [[FIELD_OFFSET_PTR]]
7271
// CHECK-NEXT: [[STRUCT_ADDR:%.*]] = bitcast %T16resilient_struct9RectangleV* %0 to i8*
7372
// CHECK-NEXT: [[FIELD_ADDR:%.*]] = getelementptr inbounds i8, i8* [[STRUCT_ADDR]], i32 [[FIELD_OFFSET]]
@@ -148,8 +147,7 @@ public struct StructWithResilientStorage {
148147
// CHECK: [[TMP:%.*]] = call swiftcc %swift.metadata_response @"$s17struct_resilience26StructWithResilientStorageVMa"([[INT]] 0)
149148
// CHECK: [[METADATA:%.*]] = extractvalue %swift.metadata_response [[TMP]], 0
150149
// CHECK-NEXT: [[METADATA_ADDR:%.*]] = bitcast %swift.type* [[METADATA]] to i32*
151-
// CHECK-NEXT: [[FIELD_OFFSET_VECTOR:%.*]] = getelementptr inbounds i32, i32* [[METADATA_ADDR]], [[INT]] [[IDX:2|4]]
152-
// CHECK-NEXT: [[FIELD_OFFSET_PTR:%.*]] = getelementptr inbounds i32, i32* [[FIELD_OFFSET_VECTOR]], i32 2
150+
// CHECK-NEXT: [[FIELD_OFFSET_PTR:%.*]] = getelementptr inbounds i32, i32* [[METADATA_ADDR]], [[INT]] [[IDX:2|4|6]]
153151
// CHECK-NEXT: [[FIELD_OFFSET:%.*]] = load i32, i32* [[FIELD_OFFSET_PTR]]
154152
// CHECK-NEXT: [[STRUCT_ADDR:%.*]] = bitcast %T17struct_resilience26StructWithResilientStorageV* %0 to i8*
155153
// CHECK-NEXT: [[FIELD_ADDR:%.*]] = getelementptr inbounds i8, i8* [[STRUCT_ADDR]], i32 [[FIELD_OFFSET]]

0 commit comments

Comments
 (0)