@@ -212,3 +212,60 @@ func callCopyAndBind<each T>(args: repeat each T) {
212
212
sequence ( )
213
213
}
214
214
215
+ struct Wrapper < Value> {
216
+ let value : Value
217
+ }
218
+
219
+ // CHECK-LABEL: @$s4main17wrapTupleElementsyAA7WrapperVyxGxQp_txxQpRvzlF
220
+ // CHECK-SAME: $@convention(thin) <each T> (@pack_guaranteed Pack{repeat each T}) -> @pack_out Pack{repeat Wrapper<each T>}
221
+ func wrapTupleElements< each T > ( _ value: repeat each T ) -> ( repeat Wrapper < each T > ) {
222
+ // CHECK: [[VALUES:%.*]] = alloc_stack [lexical] $(repeat Wrapper<each T>), let,
223
+ // CHECK-NEXT: [[ZERO:%.*]] = integer_literal $Builtin.Word, 0
224
+ // CHECK-NEXT: [[ONE:%.*]] = integer_literal $Builtin.Word, 1
225
+ // CHECK-NEXT: [[LEN:%.*]] = pack_length $Pack{repeat each T}
226
+ // CHECK-NEXT: br bb1([[ZERO]] : $Builtin.Word)
227
+ // CHECK: bb1([[IDX:%.*]] : $Builtin.Word)
228
+ // CHECK-NEXT: [[IDX_EQ_LEN:%.*]] = builtin "cmp_eq_Word"([[IDX]] : $Builtin.Word, [[LEN]] : $Builtin.Word) : $Builtin.Int1
229
+ // CHECK-NEXT: cond_br [[IDX_EQ_LEN]], bb3, bb2
230
+ // CHECK: bb2:
231
+ // CHECK-NEXT: [[INDEX:%.*]] = dynamic_pack_index [[IDX]] of $Pack{repeat Wrapper<each T>}
232
+ // CHECK-NEXT: open_pack_element [[INDEX]] of <each T> at <Pack{repeat each T}>, shape $T, uuid [[UUID:".*"]]
233
+ // CHECK-NEXT: [[ELT_ADDR:%.*]] = tuple_pack_element_addr [[INDEX]] of [[VALUES]] : $*(repeat Wrapper<each T>) as $*Wrapper<@pack_element([[UUID]]) T>
234
+ // CHECK-NEXT: [[METATYPE:%.*]] = metatype $@thin Wrapper<@pack_element([[UUID]]) T>.Type
235
+ // CHECK-NEXT: [[ARG_ELT_ADDR:%.*]] = pack_element_get [[INDEX]] of %1 : $*Pack{repeat each T} as $*@pack_element([[UUID]]) T
236
+ // CHECK-NEXT: [[ARG_COPY:%.*]] = alloc_stack $@pack_element([[UUID]]) T
237
+ // CHECK-NEXT: copy_addr [[ARG_ELT_ADDR]] to [init] [[ARG_COPY]] : $*@pack_element([[UUID]]) T
238
+ // CHECK-NEXT: // function_ref
239
+ // CHECK-NEXT: [[INIT:%.*]] = function_ref @$s4main7WrapperV5valueACyxGx_tcfC : $@convention(method) <τ_0_0> (@in τ_0_0, @thin Wrapper<τ_0_0>.Type) -> @out Wrapper<τ_0_0>
240
+ // CHECK-NEXT: apply [[INIT]]<@pack_element([[UUID]]) T>([[ELT_ADDR]], [[ARG_COPY]], [[METATYPE]])
241
+ // CHECK-NEXT: dealloc_stack [[ARG_COPY]]
242
+ // CHECK-NEXT: [[NEXT_IDX:%.*]] = builtin "add_Word"([[IDX]] : $Builtin.Word, [[ONE]] : $Builtin.Word) : $Builtin.Word
243
+ // CHECK-NEXT: br bb1([[NEXT_IDX]] : $Builtin.Word)
244
+ // CHECK: bb3:
245
+ let values = ( repeat Wrapper( value: each value) )
246
+
247
+ // CHECK-NEXT: [[VALUES_COPY:%.*]] = alloc_stack $(repeat Wrapper<each T>)
248
+ // CHECK-NEXT: copy_addr [[VALUES]] to [init] [[VALUES_COPY]] : $*(repeat Wrapper<each T>)
249
+ // CHECK-NEXT: [[ZERO:%.*]] = integer_literal $Builtin.Word, 0
250
+ // CHECK-NEXT: [[ONE:%.*]] = integer_literal $Builtin.Word, 1
251
+ // CHECK-NEXT: [[LEN:%.*]] = pack_length $Pack{repeat each T}
252
+ // CHECK-NEXT: br bb4([[ZERO]] : $Builtin.Word)
253
+ // CHECK: bb4([[IDX:%.*]] : $Builtin.Word)
254
+ // CHECK-NEXT: [[IDX_EQ_LEN:%.*]] = builtin "cmp_eq_Word"([[IDX]] : $Builtin.Word, [[LEN]] : $Builtin.Word) : $Builtin.Int1
255
+ // CHECK-NEXT: cond_br [[IDX_EQ_LEN]], bb6, bb5
256
+ // CHECK: bb5:
257
+ // CHECK-NEXT: [[INDEX:%.*]] = dynamic_pack_index [[IDX]] of $Pack{repeat Wrapper<each T>}
258
+ // CHECK-NEXT: open_pack_element [[INDEX]] of <each T> at <Pack{repeat each T}>, shape $T, uuid [[UUID:".*"]]
259
+ // CHECK-NEXT: [[OUT_ELT_ADDR:%.*]] = pack_element_get [[INDEX]] of %0 : $*Pack{repeat Wrapper<each T>} as $*Wrapper<@pack_element([[UUID]]) T>
260
+ // CHECK-NEXT: [[VALUES_COPY_ELT_ADDR:%.*]] = tuple_pack_element_addr [[INDEX]] of [[VALUES_COPY]] : $*(repeat Wrapper<each T>) as $*Wrapper<@pack_element([[UUID]]) T>
261
+ // CHECK-NEXT: copy_addr [take] [[VALUES_COPY_ELT_ADDR]] to [init] [[OUT_ELT_ADDR]] : $*Wrapper<@pack_element([[UUID]]) T>
262
+ // CHECK-NEXT: [[NEXT_IDX:%.*]] = builtin "add_Word"([[IDX]] : $Builtin.Word, [[ONE]] : $Builtin.Word) : $Builtin.Word
263
+ // CHECK-NEXT: br bb4([[NEXT_IDX]] : $Builtin.Word)
264
+ // CHECK: bb6:
265
+ // CHECK-NEXT: dealloc_stack [[VALUES_COPY]] :
266
+ // CHECK-NEXT: destroy_addr [[VALUES]] :
267
+ // CHECK-NEXT: dealloc_stack [[VALUES]] :
268
+ // CHECK-NEXT: [[RET:%.*]] = tuple ()
269
+ // CHECK-NEXT: return [[RET]] : $()
270
+ return values
271
+ }
0 commit comments