@@ -148,12 +148,76 @@ bb0(%0 : $Int):
148
148
149
149
150
150
struct ContainsNativeObject {
151
- var x : Int
152
- var y : Builtin.NativeObject
151
+ var x : Builtin.NativeObject
152
+ var y : Int32
153
+ var z : Builtin.NativeObject
153
154
}
154
155
155
- var int_global : Int
156
+ // CHECK-LABEL: sil @multiple_level_extract_1 : $@convention(thin) (@owned ContainsNativeObject) -> Builtin.Int32 {
157
+ // CHECK: bb0([[ARG:%.*]] : $ContainsNativeObject):
158
+ // CHECK: [[FIELD1:%.*]] = struct_extract [[ARG]] : $ContainsNativeObject, #ContainsNativeObject.y
159
+ // CHECK: [[FIELD2:%.*]] = struct_extract [[FIELD1]] : $Int32, #Int32._value
160
+ // CHECK: release_value [[ARG]]
161
+ // CHECK: return [[FIELD2]]
162
+ // CHECK: } // end sil function 'multiple_level_extract_1'
163
+ sil @multiple_level_extract_1 : $@convention(thin) (@owned ContainsNativeObject) -> Builtin.Int32 {
164
+ bb0(%0 : $ContainsNativeObject):
165
+ %1 = alloc_stack $ContainsNativeObject
166
+ store %0 to %1 : $*ContainsNativeObject
167
+
168
+ %2 = struct_element_addr %1 : $*ContainsNativeObject, #ContainsNativeObject.y
169
+ %3 = struct_element_addr %2 : $*Int32, #Int32._value
170
+ %4 = load %3 : $*Builtin.Int32
171
+
172
+ destroy_addr %1 : $*ContainsNativeObject
173
+ dealloc_stack %1 : $*ContainsNativeObject
174
+ return %4 : $Builtin.Int32
175
+ }
176
+
177
+ struct ComplexStruct {
178
+ var f1 : Builtin.NativeObject
179
+ var f2 : ContainsNativeObject
180
+ var f3 : Builtin.Int32
181
+ }
156
182
183
+ // CHECK-LABEL: sil @multiple_level_extract_2 : $@convention(thin) (@owned ComplexStruct) -> (@owned Builtin.NativeObject, @owned Builtin.NativeObject, Builtin.Int32) {
184
+ // CHECK: bb0([[ARG:%.*]] : $ComplexStruct):
185
+ // CHECK: [[f1:%.*]] = struct_extract [[ARG]]
186
+ // CHECK: strong_retain [[f1]]
187
+ // CHECK-NOT: strong_retain [[f1]]
188
+ // CHECK: [[f2:%.*]] = struct_extract [[ARG]]
189
+ // CHECK: [[f2_x:%.*]] = struct_extract [[f2]]
190
+ // CHECK: strong_retain [[f2_x]]
191
+ // CHECK-NOT: strong_retain [[f2_x]]
192
+ // CHECK: [[f3:%.*]] = struct_extract [[ARG]]
193
+ // CHECK: release_value [[ARG]]
194
+ // CHECK: [[RESULT:%.*]] = tuple ([[f1]] : $Builtin.NativeObject, [[f2_x]] : $Builtin.NativeObject, [[f3]] : $Builtin.Int32)
195
+ // CHECK: return [[RESULT]]
196
+ // CHECK: } // end sil function 'multiple_level_extract_2'
197
+ sil @multiple_level_extract_2 : $@convention(thin) (@owned ComplexStruct) -> (@owned Builtin.NativeObject, @owned Builtin.NativeObject, Builtin.Int32) {
198
+ bb0(%0 : $ComplexStruct):
199
+ %1 = alloc_stack $ComplexStruct
200
+ store %0 to %1 : $*ComplexStruct
201
+
202
+ %2 = struct_element_addr %1 : $*ComplexStruct, #ComplexStruct.f1
203
+ %3 = struct_element_addr %1 : $*ComplexStruct, #ComplexStruct.f2
204
+ %4 = struct_element_addr %3 : $*ContainsNativeObject, #ContainsNativeObject.x
205
+ %5 = struct_element_addr %1 : $*ComplexStruct, #ComplexStruct.f3
206
+
207
+ %6 = load %2 : $*Builtin.NativeObject
208
+ strong_retain %6 : $Builtin.NativeObject
209
+ %7 = load %4 : $*Builtin.NativeObject
210
+ strong_retain %7 : $Builtin.NativeObject
211
+ %8 = load %5 : $*Builtin.Int32
212
+
213
+ destroy_addr %1 : $*ComplexStruct
214
+ dealloc_stack %1 : $*ComplexStruct
215
+
216
+ %9 = tuple(%6 : $Builtin.NativeObject, %7 : $Builtin.NativeObject, %8 : $Builtin.Int32)
217
+ return %9 : $(Builtin.NativeObject, Builtin.NativeObject, Builtin.Int32)
218
+ }
219
+
220
+ var int_global : Int
157
221
158
222
// CHECK-LABEL: sil @promote_alloc_stack
159
223
sil @promote_alloc_stack : $@convention(thin) (Int32) -> Builtin.Int32 {
0 commit comments