Skip to content

Commit fa3ffc6

Browse files
committed
[SILGen] Update a few callers of SubstitutionMap::get to use getSingletonPackExpansion,
and update variadic generics SILGen tests for the representation change.
1 parent 74cc627 commit fa3ffc6

File tree

6 files changed

+22
-15
lines changed

6 files changed

+22
-15
lines changed

lib/SIL/IR/AbstractionPattern.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1712,7 +1712,12 @@ class SubstFunctionTypePatternVisitor
17121712
auto gp = GenericTypeParamType::get(isParameterPack, 0, paramIndex,
17131713
TC.Context);
17141714
substGenericParams.push_back(gp);
1715-
substReplacementTypes.push_back(substTy);
1715+
if (isParameterPack) {
1716+
substReplacementTypes.push_back(
1717+
PackType::getSingletonPackExpansion(substTy));
1718+
} else {
1719+
substReplacementTypes.push_back(substTy);
1720+
}
17161721

17171722
if (auto layout = pattern.getLayoutConstraint()) {
17181723
// Look at the layout constraint on this position in the abstraction pattern

lib/SILGen/SILGenConstructor.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,9 +139,13 @@ static SubstitutionMap getSubstitutionsForPropertyInitializer(
139139
// replacement types are the archetypes of the initializer itself.
140140
return SubstitutionMap::get(
141141
nominal->getGenericSignatureOfContext(),
142-
[&](SubstitutableType *type) {
142+
[&](SubstitutableType *type) -> Type {
143143
if (auto gp = type->getAs<GenericTypeParamType>()) {
144-
return genericEnv->mapTypeIntoContext(gp);
144+
auto archetype = genericEnv->mapTypeIntoContext(gp);
145+
if (!gp->isParameterPack())
146+
return archetype;
147+
148+
return PackType::getSingletonPackExpansion(archetype);
145149
}
146150

147151
return Type(type);

test/SILGen/pack_expansion_type.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ public struct VariadicType<each T> {
1414
// CHECK: bb0(%0 : $*Pack{repeat (each T, each U)}, %1 : $*Pack{repeat each T}, %2 : $*Pack{repeat each U}, %3 : $VariadicType<repeat each T>):
1515
public func variadicMethod<each U>(t: repeat each T, u: repeat each U) -> (repeat (each T, each U)) {}
1616

17-
// CHECK-LABEL: sil [ossa] @$s19pack_expansion_type12VariadicTypeV13takesFunction1tyqd__qd__Qp_txxQpXE_tRvd__lF : $@convention(method) <each T><each U> (@guaranteed @noescape @callee_guaranteed @substituted <each τ_0_0, each τ_0_1, each τ_0_2, each τ_0_3> (@pack_guaranteed Pack{repeat each τ_0_0}) -> @pack_out Pack{repeat each τ_0_2} for <T, T, U, U>, VariadicType<repeat each T>) -> () {
18-
// CHECK: bb0(%0 : @guaranteed $@noescape @callee_guaranteed @substituted <each τ_0_0, each τ_0_1, each τ_0_2, each τ_0_3> (@pack_guaranteed Pack{repeat each τ_0_0}) -> @pack_out Pack{repeat each τ_0_2} for <T, T, U, U>, %1 : $VariadicType<repeat each T>):
17+
// CHECK-LABEL: sil [ossa] @$s19pack_expansion_type12VariadicTypeV13takesFunction1tyqd__qd__Qp_txxQpXE_tRvd__lF : $@convention(method) <each T><each U> (@guaranteed @noescape @callee_guaranteed @substituted <each τ_0_0, each τ_0_1, each τ_0_2, each τ_0_3> (@pack_guaranteed Pack{repeat each τ_0_0}) -> @pack_out Pack{repeat each τ_0_2} for <Pack{repeat each T}, Pack{repeat each T}, Pack{repeat each U}, Pack{repeat each U}>, VariadicType<repeat each T>) -> () {
18+
// CHECK: bb0(%0 : @guaranteed $@noescape @callee_guaranteed @substituted <each τ_0_0, each τ_0_1, each τ_0_2, each τ_0_3> (@pack_guaranteed Pack{repeat each τ_0_0}) -> @pack_out Pack{repeat each τ_0_2} for <Pack{repeat each T}, Pack{repeat each T}, Pack{repeat each U}, Pack{repeat each U}>, %1 : $VariadicType<repeat each T>):
1919
public func takesFunction<each U>(t: (repeat each T) -> (repeat each U)) {}
2020
}
2121

test/SILGen/variadic-generic-arguments.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ func receive_simple<each T>(_ args: repeat each T) {}
2121
// CHECK: bb2:
2222
// CHECK-NEXT: [[IDX:%.*]] = builtin "sub_Word"([[LAST_IDX]] : $Builtin.Word, [[ONE]] : $Builtin.Word) : $Builtin.Word
2323
// CHECK-NEXT: [[INDEX:%.*]] = dynamic_pack_index [[IDX]] of $Pack{repeat each T}
24-
// CHECK-NEXT: open_pack_element [[INDEX]] of <each T> at <T>, shape $T, uuid [[UUID:".*"]]
24+
// CHECK-NEXT: open_pack_element [[INDEX]] of <each T> at <Pack{repeat each T}>, shape $T, uuid [[UUID:".*"]]
2525
// CHECK-NEXT: [[ELT_ADDR:%.*]] = pack_element_get [[INDEX]] of %0 : $*Pack{repeat each T} as $*@pack_element([[UUID]]) T
2626
// CHECK-NEXT: destroy_addr [[ELT_ADDR]] : $*@pack_element([[UUID]]) T
2727
// CHECK-NEXT: br bb1([[IDX]] : $Builtin.Word)
@@ -109,7 +109,7 @@ func scalar_test1(i: Int, f: Float, s: String) {
109109
// CHECK-NEXT: cond_br [[IDX_EQ_LEN]], bb3, bb2
110110
// CHECK: bb2:
111111
// CHECK-NEXT: [[INDEX:%.*]] = dynamic_pack_index [[IDX]] of $Pack{repeat each T}
112-
// CHECK-NEXT: open_pack_element [[INDEX]] of <each T> at <T>, shape $T, uuid [[UUID:".*"]]
112+
// CHECK-NEXT: open_pack_element [[INDEX]] of <each T> at <Pack{repeat each T}>, shape $T, uuid [[UUID:".*"]]
113113
// CHECK-NEXT: [[DST_ELT_ADDR:%.*]] = tuple_pack_element_addr [[INDEX]] of [[TUPLE]] : $*(repeat each T) as $*@pack_element([[UUID]]) T
114114
// CHECK-NEXT: [[SRC_ELT_ADDR:%.*]] = pack_element_get [[INDEX]] of %0 : $*Pack{repeat each T} as $*@pack_element([[UUID]]) T
115115
// CHECK-NEXT: copy_addr [[SRC_ELT_ADDR]] to [init] [[DST_ELT_ADDR]] : $*@pack_element([[UUID]]) T
@@ -142,7 +142,7 @@ func pack_test0<each T>(args: repeat each T) {
142142
// CHECK-NEXT: cond_br [[IDX_EQ_LEN]], bb3, bb2
143143
// CHECK: bb2:
144144
// CHECK-NEXT: [[INDEX:%.*]] = dynamic_pack_index [[IDX]] of $Pack{repeat each T}
145-
// CHECK-NEXT: open_pack_element [[INDEX]] of <each T> at <T>, shape $T, uuid [[UUID:".*"]]
145+
// CHECK-NEXT: open_pack_element [[INDEX]] of <each T> at <Pack{repeat each T}>, shape $T, uuid [[UUID:".*"]]
146146
// CHECK-NEXT: [[DST_ELT_ADDR:%.*]] = tuple_pack_element_addr [[INDEX]] of [[TUPLE]] : $*(repeat each T) as $*@pack_element([[UUID]]) T
147147
// CHECK-NEXT: [[SRC_ELT_ADDR:%.*]] = pack_element_get [[INDEX]] of %0 : $*Pack{repeat each T} as $*@pack_element([[UUID]]) T
148148
// CHECK-NEXT: copy_addr [[SRC_ELT_ADDR]] to [init] [[DST_ELT_ADDR]] : $*@pack_element([[UUID]]) T
@@ -181,7 +181,7 @@ func pack_test1<each T>(args: repeat each T) {
181181
// CHECK-NEXT: cond_br [[IDX_EQ_LEN]], bb3, bb2
182182
// CHECK: bb2:
183183
// CHECK-NEXT: [[EXPANSION_INDEX:%.*]] = dynamic_pack_index [[IDX]] of $Pack{repeat each T}
184-
// CHECK-NEXT: open_pack_element [[EXPANSION_INDEX]] of <each T> at <T>, shape $T, uuid [[UUID:".*"]]
184+
// CHECK-NEXT: open_pack_element [[EXPANSION_INDEX]] of <each T> at <Pack{repeat each T}>, shape $T, uuid [[UUID:".*"]]
185185
// CHECK-NEXT: [[INDEX:%.*]] = pack_pack_index 1, [[EXPANSION_INDEX]] of $Pack{Int, repeat each T, String}
186186
// CHECK-NEXT: [[DST_ELT_ADDR:%.*]] = tuple_pack_element_addr [[EXPANSION_INDEX]] of [[TUPLE]] : $*(repeat each T) as $*@pack_element([[UUID]]) T
187187
// CHECK-NEXT: [[SRC_ELT_ADDR:%.*]] = pack_element_get [[EXPANSION_INDEX]] of %0 : $*Pack{repeat each T} as $*@pack_element([[UUID]]) T

test/SILGen/variadic-generic-results.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ func copyOrThrow<T>(value: T) throws -> T { return value }
1515
// CHECK-NEXT: cond_br [[IDX_EQ_LEN]], bb3, bb2
1616
// CHECK: bb2:
1717
// CHECK-NEXT: [[INDEX:%.*]] = dynamic_pack_index [[IDX]] of $Pack{repeat each T}
18-
// CHECK-NEXT: open_pack_element [[INDEX]] of <each T> at <T>, shape $T, uuid [[UUID:".*"]]
18+
// CHECK-NEXT: open_pack_element [[INDEX]] of <each T> at <Pack{repeat each T}>, shape $T, uuid [[UUID:".*"]]
1919
// CHECK-NEXT: [[DEST_ELT_ADDR:%.*]] = pack_element_get [[INDEX]] of [[OUT]] : $*Pack{repeat each T} as $*@pack_element([[UUID]]) T
2020
// CHECK-NEXT: [[SRC_ELT_ADDR:%.*]] = pack_element_get [[INDEX]] of [[IN]] : $*Pack{repeat each T} as $*@pack_element([[UUID]]) T
2121
// CHECK-NEXT: copy_addr [[SRC_ELT_ADDR]] to [init] [[DEST_ELT_ADDR]] : $*@pack_element([[UUID]]) T
@@ -41,7 +41,7 @@ func copyIntoTuple<each T>(_ args: repeat each T) -> (repeat each T) {
4141
// CHECK-NEXT: cond_br [[IDX_EQ_LEN]], bb4, bb2
4242
// CHECK: bb2:
4343
// CHECK-NEXT: [[INDEX:%.*]] = dynamic_pack_index [[IDX]] of $Pack{repeat each T}
44-
// CHECK-NEXT: open_pack_element [[INDEX]] of <each T> at <T>, shape $T, uuid [[UUID:".*"]]
44+
// CHECK-NEXT: open_pack_element [[INDEX]] of <each T> at <Pack{repeat each T}>, shape $T, uuid [[UUID:".*"]]
4545
// CHECK-NEXT: [[DEST_ELT_ADDR:%.*]] = pack_element_get [[INDEX]] of [[OUT]] : $*Pack{repeat each T} as $*@pack_element([[UUID]]) T
4646
// CHECK-NEXT: [[SRC_ELT_ADDR:%.*]] = pack_element_get [[INDEX]] of [[IN]] : $*Pack{repeat each T} as $*@pack_element([[UUID]]) T
4747
// FIXME: make this a borrow
@@ -71,7 +71,7 @@ func copyIntoTuple<each T>(_ args: repeat each T) -> (repeat each T) {
7171
// CHECK: bb7:
7272
// CHECK-NEXT: [[DESTROY_IDX:%.*]] = builtin "sub_Word"([[LAST_IDX]] : $Builtin.Word, [[ONE]] : $Builtin.Word) : $Builtin.Word
7373
// CHECK-NEXT: [[DESTROY_INDEX:%.*]] = dynamic_pack_index [[DESTROY_IDX]] of $Pack{repeat each T}
74-
// CHECK-NEXT: open_pack_element [[DESTROY_INDEX]] of <each T> at <T>, shape $T, uuid [[DESTROY_UUID:".*"]]
74+
// CHECK-NEXT: open_pack_element [[DESTROY_INDEX]] of <each T> at <Pack{repeat each T}>, shape $T, uuid [[DESTROY_UUID:".*"]]
7575
// CHECK-NEXT: [[DESTROY_ELT_ADDR:%.*]] = pack_element_get [[DESTROY_INDEX]] of [[OUT]] : $*Pack{repeat each T} as $*@pack_element([[DESTROY_UUID]]) T
7676
// CHECK-NEXT: destroy_addr [[DESTROY_ELT_ADDR]] : $*@pack_element([[DESTROY_UUID]]) T
7777
// CHECK-NEXT: br bb6([[DESTROY_IDX]] : $Builtin.Word)

test/SILGen/variadic-generic-tuples.swift

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,8 @@ func takeAny(_ arg: Any) {}
1414
// CHECK-NEXT: [[IDX_EQ_LEN:%.*]] = builtin "cmp_eq_Word"([[IDX]] : $Builtin.Word, [[LEN]] : $Builtin.Word) : $Builtin.Int1
1515
// CHECK-NEXT: cond_br [[IDX_EQ_LEN]], bb3, bb2
1616
// CHECK: bb2:
17-
// FIXME: this next line will change when we fix the printing of invariant
18-
// expansion types to be explicit about the expansion shape
1917
// CHECK-NEXT: [[INDEX:%.*]] = dynamic_pack_index [[IDX]] of $Pack{repeat ()}
20-
// CHECK-NEXT: open_pack_element [[INDEX]] of <each T> at <T>, shape $T, uuid [[UUID:".*"]]
18+
// CHECK-NEXT: open_pack_element [[INDEX]] of <each T> at <Pack{repeat each T}>, shape $T, uuid [[UUID:".*"]]
2119
// CHECK-NEXT: [[TEMP:%.*]] = alloc_stack $Any
2220
// CHECK-NEXT: [[ELT_ADDR:%.*]] = pack_element_get [[INDEX]] of %0 : $*Pack{repeat each T} as $*@pack_element([[UUID]]) T
2321
// CHECK-NEXT: [[TEMP_AS_T:%.*]] = init_existential_addr [[TEMP]] : $*Any, $@pack_element([[UUID]]) T

0 commit comments

Comments
 (0)