Skip to content

Commit 3df2a25

Browse files
authored
Merge pull request swiftlang#19796 from rajbarik/raj-es-default
Fix ExistentialSpecializer for cases when the argument is an Archetype
2 parents d03a8cc + 97e9dde commit 3df2a25

File tree

2 files changed

+32
-2
lines changed

2 files changed

+32
-2
lines changed

lib/SILOptimizer/FunctionSignatureTransforms/ExistentialTransform.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,8 @@ void ExistentialSpecializerCloner::cloneAndPopulateFunction() {
177177
} else {
178178
/// Arguments that are not rewritten.
179179
auto Ty = params[ArgDesc.Index].getType();
180-
auto MappedTy = M.Types.getLoweredType(NewF.mapTypeIntoContext(Ty));
180+
auto LoweredTy = M.Types.getLoweredType(NewF.mapTypeIntoContext(Ty));
181+
auto MappedTy = LoweredTy.getCategoryType(ArgDesc.Arg->getType().getCategory());
181182
NewArg = ClonedEntryBB->createFunctionArgument(MappedTy, ArgDesc.Decl);
182183
NewArg->setOwnershipKind(ValueOwnershipKind(
183184
M, MappedTy, ArgDesc.Arg->getArgumentConvention()));

test/SILOptimizer/existential_transform.swift

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -331,6 +331,33 @@ func wrap_gcp<T:GP>(_ a:T,_ b:GP) -> Int {
331331
return wrap_gcp(a, k)
332332
}
333333

334+
func wrap_gcp_arch<T:GP>(_ a:T,_ b:GP, _ c:inout Array<T>) -> Int {
335+
return a.foo() + b.foo() + c[0].foo()
336+
}
337+
// CHECK-LABEL: sil hidden [noinline] @$s21existential_transform8gcp_archySix_SayxGztAA2GPRzlF : $@convention(thin) <T where T : GP> (@in_guaranteed T, @inout Array<T>) -> Int {
338+
// CHECK: bb0(%0 : $*T, %1 : $*Array<T>):
339+
// CHECK: debug_value_addr
340+
// CHECK: debug_value_addr
341+
// CHECK: alloc_ref
342+
// CHECK: debug_value
343+
// CHECK: debug_value
344+
// CHECK: alloc_stack
345+
// CHECK: init_existential_addr
346+
// CHECK: store
347+
// CHECK: function_ref @$s21existential_transform13wrap_gcp_archySix_AA2GP_pSayxGztAaCRzlFTf4nen_n : $@convention(thin) <τ_0_0 where τ_0_0 : GP><τ_1_0 where τ_1_0 : GP> (@in_guaranteed τ_0_0, @in_guaranteed τ_1_0, @inout Array<τ_0_0>) -> Int
348+
// CHECK: open_existential_addr
349+
// CHECK: strong_retain
350+
// CHECK: apply
351+
// CHECK: destroy_addr
352+
// CHECK: dealloc_stack
353+
// CHECK: strong_release
354+
// CHECK: return
355+
// CHECK-LABEL: } // end sil function '$s21existential_transform8gcp_archySix_SayxGztAA2GPRzlF'
356+
@inline(never) func gcp_arch<T:GP>(_ a:T, _ b:inout Array<T>) -> Int {
357+
let k:GC = GC()
358+
return wrap_gcp_arch(a, k, &b)
359+
}
360+
334361
@_optimize(none) public func foo() -> Int {
335362
cp()
336363
ncp()
@@ -342,5 +369,7 @@ do_not_optimize_inout_cp()
342369
inout_ncp()
343370
struct_inout_ncp()
344371
let y:Int = gcp(GC())
345-
return x + y
372+
var a:Array<GC> = [GC()]
373+
let z:Int = gcp_arch(GC(), &a)
374+
return x + y + z
346375
}

0 commit comments

Comments
 (0)