Skip to content

Commit c361108

Browse files
committed
Support pack iteration in closures
1 parent 7df8014 commit c361108

File tree

2 files changed

+62
-5
lines changed

2 files changed

+62
-5
lines changed

lib/AST/ASTWalker.cpp

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1905,11 +1905,9 @@ Stmt *Traversal::visitForEachStmt(ForEachStmt *S) {
19051905
//
19061906
// If for-in is already type-checked, the type-checked version
19071907
// of the sequence is going to be visited as part of `iteratorVar`.
1908-
if (S->getTypeCheckedSequence()) {
1909-
if (auto IteratorVar = S->getIteratorVar()) {
1910-
if (doIt(IteratorVar))
1911-
return nullptr;
1912-
}
1908+
if (auto IteratorVar = S->getIteratorVar()) {
1909+
if (doIt(IteratorVar))
1910+
return nullptr;
19131911

19141912
if (auto NextCall = S->getNextCall()) {
19151913
if ((NextCall = doIt(NextCall)))

test/SILGen/pack_iteration.swift

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)