@@ -2118,12 +2118,10 @@ TypeDecl *EquivalenceClass::lookupNestedType(
2118
2118
Type EquivalenceClass::getAnchor (
2119
2119
GenericSignatureBuilder &builder,
2120
2120
TypeArrayView<GenericTypeParamType> genericParams) {
2121
- // Check whether the cache is valid.
2122
- if (archetypeAnchorCache.anchor &&
2123
- archetypeAnchorCache.numMembers == members.size ()) {
2124
- ++NumArchetypeAnchorCacheHits;
2121
+ // Substitute into the anchor with the given generic parameters.
2122
+ auto substAnchor = [&] {
2123
+ if (genericParams.empty ()) return archetypeAnchorCache.anchor ;
2125
2124
2126
- // Reparent the anchor using genericParams.
2127
2125
return archetypeAnchorCache.anchor .subst (
2128
2126
[&](SubstitutableType *dependentType) {
2129
2127
if (auto gp = dyn_cast<GenericTypeParamType>(dependentType)) {
@@ -2135,30 +2133,28 @@ Type EquivalenceClass::getAnchor(
2135
2133
return Type (dependentType);
2136
2134
},
2137
2135
MakeAbstractConformanceForGenericType ());
2138
- }
2139
2136
2140
- // Map the members of this equivalence class to the best associated type
2141
- // within that equivalence class.
2142
- llvm::SmallDenseMap<EquivalenceClass *, AssociatedTypeDecl *> nestedTypes;
2143
-
2144
- Type bestGenericParam;
2145
- for (auto member : members) {
2146
- // If the member is a generic parameter, keep the best generic parameter.
2147
- if (member->isGenericParam ()) {
2148
- Type genericParamType = member->getDependentType (genericParams);
2149
- if (!bestGenericParam ||
2150
- compareDependentTypes (genericParamType, bestGenericParam) < 0 )
2151
- bestGenericParam = genericParamType;
2152
- continue ;
2153
- }
2137
+ };
2154
2138
2155
- // If we saw a generic parameter, ignore any nested types.
2156
- if (bestGenericParam) continue ;
2139
+ // Check whether the cache is valid.
2140
+ if (archetypeAnchorCache.anchor &&
2141
+ archetypeAnchorCache.lastGeneration == builder.Impl ->Generation ) {
2142
+ ++NumArchetypeAnchorCacheHits;
2143
+ return substAnchor ();
2157
2144
}
2158
2145
2159
- // If we found a generic parameter, return that.
2160
- if (bestGenericParam)
2161
- return bestGenericParam;
2146
+ // Check whether we already have an anchor, in which case we
2147
+ // can simplify it further.
2148
+ if (archetypeAnchorCache.anchor ) {
2149
+ // Record the cache miss.
2150
+ ++NumArchetypeAnchorCacheMisses;
2151
+
2152
+ // Update the anchor by simplifying it further.
2153
+ archetypeAnchorCache.anchor =
2154
+ builder.getCanonicalTypeParameter (archetypeAnchorCache.anchor );
2155
+ archetypeAnchorCache.lastGeneration = builder.Impl ->Generation ;
2156
+ return substAnchor ();
2157
+ }
2162
2158
2163
2159
// Form the anchor.
2164
2160
for (auto member : members) {
@@ -2169,8 +2165,8 @@ Type EquivalenceClass::getAnchor(
2169
2165
// Record the cache miss and update the cache.
2170
2166
++NumArchetypeAnchorCacheMisses;
2171
2167
archetypeAnchorCache.anchor = anchorType;
2172
- archetypeAnchorCache.numMembers = members. size () ;
2173
- return anchorType ;
2168
+ archetypeAnchorCache.lastGeneration = builder. Impl -> Generation ;
2169
+ return substAnchor () ;
2174
2170
}
2175
2171
2176
2172
llvm_unreachable (" Unable to compute anchor" );
0 commit comments