@@ -226,3 +226,62 @@ func iterateContinueBreak<each Element>(over element: repeat each Element) {
226
226
funcEnd ( )
227
227
}
228
228
229
+ // CHECK-LABEL: sil hidden [ossa] @$s14pack_iteration14iterateClosure4overyxxQp_tRvzlF : $@convention(thin) <each Element> (@pack_guaranteed Pack{repeat each Element}) -> () {
230
+ //
231
+ // CHECK-LABEL: sil private [ossa] @$s14pack_iteration14iterateClosure4overyxxQp_tRvzlFyycfU_ : $@convention(thin) <each Element> (@in_guaranteed (repeat each Element)) -> () {
232
+ //
233
+ // CHECK: bb0([[PACK:%.*]] : @closureCapture $*(repeat each Element)):
234
+ // CHECK: [[ALLOC_PACK:%.*]] = alloc_pack $Pack{repeat each Element}
235
+ // CHECK: [[IDX1:%.*]] = integer_literal $Builtin.Word, 0
236
+ // CHECK: [[IDX2:%.*]] = integer_literal $Builtin.Word, 1
237
+ // CHECK: [[PACK_LENGTH:%.*]] = pack_length $Pack{repeat each Element}
238
+ // CHECK: br [[LOOP_DEST:bb[0-9]+]]([[IDX1]] : $Builtin.Word)
239
+ //
240
+ // CHECK: [[LOOP_DEST]]([[IDX3:%.*]] : $Builtin.Word):
241
+ // CHECK: [[COND:%.*]] = builtin "cmp_eq_Word"([[IDX3]] : $Builtin.Word, [[PACK_LENGTH]] : $Builtin.Word) : $Builtin.Int1
242
+ // CHECK: cond_br [[COND]], [[SETUP_BB:bb[0-9]+]], [[ITER_BB:bb[0-9]+]]
243
+ //
244
+ // CHECK: [[ITER_BB]]:
245
+ // CHECK: [[PACK_IDX:%.*]] = dynamic_pack_index [[IDX3]] of $Pack{repeat each Element}
246
+ // CHECK: [[OPEN_ELT:%.*]] = open_pack_element [[PACK_IDX]] of <each Element> at <Pack{repeat each Element}>, shape $each Element, uuid "[[UUID:.*]]"
247
+ // CHECK: [[TUPLE_ADDR:%.*]] = tuple_pack_element_addr [[PACK_IDX]] of [[PACK]] : $*(repeat each Element) as $*@pack_element("[[UUID]]") each Element
248
+ // CHECK: pack_element_set [[TUPLE_ADDR]] : $*@pack_element("[[UUID]]") each Element into [[PACK_IDX]] of [[ALLOC_PACK]] : $*Pack{repeat each Element}
249
+ // CHECK: [[ADD_WORD:%.*]] = builtin "add_Word"([[IDX3]] : $Builtin.Word, [[IDX2]] : $Builtin.Word) : $Builtin.Word
250
+ // CHECK: br [[LOOP_DEST]]([[ADD_WORD]] : $Builtin.Word)
251
+ //
252
+ // CHECK: [[SETUP_BB]]
253
+ // CHECK: debug_value [[ALLOC_PACK]] : $*Pack{repeat each Element}, let, name "element", argno 1, expr op_deref
254
+ // CHECK: [[SETUP_0:%.*]] = integer_literal $Builtin.Word, 0
255
+ // CHECK: [[SETUP_1:%.*]] = integer_literal $Builtin.Word, 1
256
+ // CHECK: [[SETUP_LENGTH:%.*]] = pack_length $Pack{repeat each Element}
257
+ // CHECK: br [[LOOP_DEST:bb[0-9]+]]([[SETUP_0]] : $Builtin.Word)
258
+ //
259
+ // CHECK: [[LOOP_DEST]]([[IDX4:%.*]] : $Builtin.Word):
260
+ // CHECK: [[COND:%.*]] = builtin "cmp_eq_Word"([[IDX4]] : $Builtin.Word, [[SETUP_LENGTH]] : $Builtin.Word) : $Builtin.Int1
261
+ // CHECK: cond_br [[COND]], [[NONE_BB:bb[0-9]+]], [[SOME_BB:bb[0-9]+]]
262
+ //
263
+ // CHECK: [[SOME_BB]]:
264
+ // CHECK: [[DYN_PACK_IDX:%.*]] = dynamic_pack_index [[IDX4]] of $Pack{repeat each Element}
265
+ // CHECK: open_pack_element [[DYN_PACK_IDX]] of <each Element> at <Pack{repeat each Element}>, shape $each Element, uuid "[[UUID:.*]]"
266
+ // CHECK: [[STACK:%.*]] = alloc_stack [lexical] $@pack_element("[[UUID]]") each Element, let, name "el"
267
+ // CHECK: [[PACK_ELT_GET:%.*]] = pack_element_get [[DYN_PACK_IDX]] of [[ALLOC_PACK]] : $*Pack{repeat each Element} as $*@pack_element("[[UUID]]") each Element
268
+ // CHECK: copy_addr [[PACK_ELT_GET]] to [init] [[STACK]] : $*@pack_element("[[UUID]]") each Element
269
+ // CHECK: [[LOOP_END_FUNC:%.*]] = function_ref @loopBodyEnd : $@convention(thin) () -> ()
270
+ // CHECK: apply [[LOOP_END_FUNC]]() : $@convention(thin) () -> ()
271
+ // CHECK: destroy_addr [[STACK]] : $*@pack_element("[[UUID]]") each Element
272
+ // CHECK: dealloc_stack [[STACK]] : $*@pack_element("[[UUID]]") each Element
273
+ // CHECK: br [[LATCH_BB:bb[0-9]+]]
274
+ //
275
+ // CHECK: [[NONE_BB]]:
276
+ // CHECK: dealloc_pack [[ALLOC_PACK]] : $*Pack{repeat each Element}
277
+ //
278
+ // CHECK: [[LATCH_BB]]:
279
+ // CHECK: [[ADD_WORD:%.*]] = builtin "add_Word"([[IDX4]] : $Builtin.Word, [[SETUP_1]] : $Builtin.Word) : $Builtin.Word
280
+ // CHECK: br [[LOOP_DEST]]([[ADD_WORD]] : $Builtin.Word)
281
+ func iterateClosure< each Element > ( over element: repeat each Element ) {
282
+ let _ = { ( ) -> Void in
283
+ for el in repeat each element {
284
+ loopBodyEnd ( )
285
+ }
286
+ }
287
+ }
0 commit comments