@@ -226,3 +226,62 @@ func iterateContinueBreak<each Element>(over element: repeat each Element) {
226226 funcEnd ( )
227227}
228228
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