Skip to content

Commit 3cca788

Browse files
committed
[SILGen] Add a test case for materialized packs.
1 parent dce70f3 commit 3cca788

File tree

1 file changed

+53
-0
lines changed

1 file changed

+53
-0
lines changed

test/SILGen/variadic-generic-tuples.swift

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,3 +112,56 @@ public struct Container<each T> {
112112
// CHECK-NEXT: return [[RET]] : $()
113113

114114
// CHECK-LABEL: sil {{.*}}@$s4main9ContainerV7storageAA6StoredVyxGxQp_tvM
115+
116+
struct Wrapper<Value> {
117+
let value: Value
118+
}
119+
120+
// CHECK-LABEL: @$s4main17wrapTupleElementsyAA7WrapperVyxGxQp_txxQpRvzlF : $@convention(thin) <each T> (@pack_guaranteed Pack{repeat each T}) -> @pack_out Pack{repeat Wrapper<each T>}
121+
func wrapTupleElements<each T>(_ value: repeat each T) -> (repeat Wrapper<each T>) {
122+
// CHECK: [[RETURN_VAL:%.*]] : $*Pack{repeat Wrapper<each T>}
123+
124+
// CHECK: [[VAR:%.*]] = alloc_stack [lexical] $(repeat each T)
125+
let values = (repeat each value)
126+
127+
// Create a temporary for the 'values' in 'each values.element'
128+
// CHECK: bb3:
129+
// CHECK-NEXT: [[TEMP:%.*]] = alloc_stack $(repeat each T)
130+
// CHECK-NEXT: copy_addr [[VAR]] to [init] [[TEMP]] : $*(repeat each T)
131+
132+
// Integer values for dynamic pack loop
133+
// CHECK-NEXT: [[ZERO:%.*]] = integer_literal $Builtin.Word, 0
134+
// CHECK-NEXT: [[ONE:%.*]] = integer_literal $Builtin.Word, 1
135+
// CHECK-NEXT: [[PACK_LEN:%.*]] = pack_length $Pack{repeat each T}
136+
// CHECK-NEXT: br bb4([[ZERO]] : $Builtin.Word)
137+
138+
// Loop condition
139+
// CHECK: bb4([[INDEX:%.*]] : $Builtin.Word)
140+
// CHECK-NEXT: [[INDEX_EQ_LEN:%.*]] = builtin "cmp_eq_Word"([[INDEX]] : $Builtin.Word, [[PACK_LEN]] : $Builtin.Word) : $Builtin.Int1
141+
// CHECK-NEXT: cond_br [[INDEX_EQ_LEN]], bb6, bb5
142+
143+
// Loop body
144+
// CHECK: bb5:
145+
// CHECK-NEXT: [[CUR_INDEX:%.*]] = dynamic_pack_index [[INDEX]] of $Pack{repeat Wrapper<each T>}
146+
// CHECK-NEXT: open_pack_element [[CUR_INDEX]] of <each T> at <Pack{repeat each T}>, shape $T, uuid [[UUID:".*"]]
147+
// CHECK-NEXT: [[RETURN_VAL_ELT_ADDR:%.*]] = pack_element_get [[CUR_INDEX]] of [[RETURN_VAL]] : $*Pack{repeat Wrapper<each T>} as $*Wrapper<@pack_element([[UUID]]) T>
148+
// CHECK-NEXT: [[METATYPE:%.*]] = metatype $@thin Wrapper<@pack_element([[UUID]]) T>.Type
149+
// CHECK-NEXT: [[TUPLE_ELT_ADDR:%.*]] = tuple_pack_element_addr [[CUR_INDEX]] of [[TEMP]] : $*(repeat each T) as $*@pack_element([[UUID]]) T
150+
// CHECK-NEXT: [[INIT_ARG:%.*]] = alloc_stack $@pack_element([[UUID]]) T
151+
// CHECK-NEXT: copy_addr [[TUPLE_ELT_ADDR]] to [init] [[INIT_ARG]] : $*@pack_element([[UUID]]) T
152+
// function_ref Wrapper.init(value:)
153+
// CHECK: [[INIT:%.*]] = function_ref @$s4main7WrapperV5valueACyxGx_tcfC : $@convention(method) <τ_0_0> (@in τ_0_0, @thin Wrapper<τ_0_0>.Type) -> @out Wrapper<τ_0_0>
154+
// CHECK-NEXT: apply [[INIT]]<@pack_element([[UUID]]) T>([[RETURN_VAL_ELT_ADDR]], [[INIT_ARG]], [[METATYPE]]) : $@convention(method) <τ_0_0> (@in τ_0_0, @thin Wrapper<τ_0_0>.Type) -> @out Wrapper<τ_0_0>
155+
// CHECK-NEXT: dealloc_stack [[INIT_ARG]] : $*@pack_element([[UUID]]) T
156+
// CHECK-NEXT: [[NEXT_INDEX:%.*]] = builtin "add_Word"([[INDEX]] : $Builtin.Word, [[ONE]] : $Builtin.Word) : $Builtin.Word
157+
// CHECK-NEXT: br bb4([[NEXT_INDEX]] : $Builtin.Word)
158+
159+
return (repeat Wrapper(value: each values.element))
160+
161+
// CHECK: destroy_addr [[TEMP]] : $*(repeat each T)
162+
// CHECK: dealloc_stack [[TEMP]] : $*(repeat each T)
163+
// CHECK: destroy_addr [[VAR]] : $*(repeat each T)
164+
// CHECK: dealloc_stack [[VAR]] : $*(repeat each T)
165+
// CHECK-NEXT: [[RET:%.*]] = tuple ()
166+
// CHECK-NEXT: return [[RET]] : $()
167+
}

0 commit comments

Comments
 (0)