Skip to content

Commit f9e5de9

Browse files
committed
IRGen: Reenable caching opaque type metadata accessors.
Dynamic replacement can only really get away with replacing opaque return types if a function's opaque type has never been instantiated in the first place. Meanwhile, repeatedly instantiating the metadata is too slow for many clients to tolerate. Fixes rdar://problem/53213600.
1 parent c414fdc commit f9e5de9

File tree

5 files changed

+4
-213
lines changed

5 files changed

+4
-213
lines changed

lib/IRGen/MetadataRequest.cpp

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -642,11 +642,6 @@ static MetadataResponse emitNominalMetadataRef(IRGenFunction &IGF,
642642
bool irgen::isTypeMetadataAccessTrivial(IRGenModule &IGM, CanType type) {
643643
assert(!type->hasArchetype());
644644

645-
// Support dynamically replacing opaque result types. Don't cache the
646-
// accessor result.
647-
if (!IGM.getOptions().shouldOptimize() && type->hasOpaqueArchetype())
648-
return true;
649-
650645
// Value type metadata only requires dynamic initialization on first
651646
// access if it contains a resilient type.
652647
if (isa<StructType>(type) || isa<EnumType>(type)) {
@@ -1489,6 +1484,7 @@ void irgen::emitCacheAccessFunction(IRGenModule &IGM,
14891484

14901485
// If the load yielded null, emit the type metadata.
14911486
IGF.Builder.emitBlock(isNullBB);
1487+
14921488
MetadataResponse response = getValue(IGF, parameters);
14931489

14941490
// Ensure that we have a dynamically-correct state value.

test/IRGen/opaque_result_type.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -161,10 +161,10 @@ public func useFoo(x: String, y: C) {
161161
}
162162

163163
// CHECK-LABEL: define {{.*}} @"$s18opaque_result_type6useFoo1x1yySS_AA1CCtF"
164-
// CHECK: [[CONFORMANCE:%.*]] = call swiftcc i8** @swift_getOpaqueTypeConformance(i8* {{.*}}, %swift.type_descriptor* {{.*}}s18opaque_result_type3baz1zQrx_tAA1PRzAA1QRzlFQOMQ{{.*}}, [[WORD:i32|i64]] 2)
165-
// CHECK: [[MD:%.*]] = call swiftcc %swift.metadata_response @swift_getOpaqueTypeMetadata([[WORD]] 255, i8* {{.*}}, %swift.type_descriptor* {{.*}}s18opaque_result_type3baz1zQrx_tAA1PRzAA1QRzlFQOMQ{{.*}})
164+
// CHECK: [[CONFORMANCE:%.*]] = call swiftcc i8** @swift_getOpaqueTypeConformance(i8* {{.*}}, %swift.type_descriptor* {{.*}}s18opaque_result_type3baz1zQrx_tAA1PRzAA1QRzlFQOMQ{{.*}}, [[WORD:i32|i64]] 1)
165+
// CHECK: [[MD:%.*]] = call swiftcc %swift.metadata_response @"$s18opaque_result_type3baz1zQrx_tAA1PRzAA1QRzlFQOyAA1CCQo_Ma"
166166
// CHECK: [[TYPE:%.*]] = extractvalue %swift.metadata_response [[MD]], 0
167-
// CHECK: call swiftcc %swift.metadata_response @swift_getAssociatedTypeWitness([[WORD]] 0, i8** [[CONFORMANCE]], %swift.type* [[TYPE]]
167+
// CHECK: call swiftcc i8** @swift_getAssociatedConformanceWitness(i8** [[CONFORMANCE]], %swift.type* [[TYPE]]
168168

169169
// CHECK-LABEL: define {{.*}} @"$sSS18opaque_result_type1PAA1AAaBP_AA1OPWT"
170170
// CHECK: call swiftcc i8** @swift_getOpaqueTypeConformance(i8* {{.*}}, %swift.type_descriptor* {{.*}}sSS18opaque_result_typeE3pooQryFQOMQ{{.*}}, [[WORD]] 1)

test/Interpreter/Inputs/dynamic_replacement_opaque1.swift

Lines changed: 0 additions & 61 deletions
This file was deleted.

test/Interpreter/Inputs/dynamic_replacement_opaque2.swift

Lines changed: 0 additions & 53 deletions
This file was deleted.

test/Interpreter/dynamic_replacement_opaque_result.swift

Lines changed: 0 additions & 91 deletions
This file was deleted.

0 commit comments

Comments
 (0)