Skip to content

Commit c3ff4d4

Browse files
authored
Merge pull request swiftlang#35319 from xedin/remove-checked-conformances-cache
[ConstraintSystem] Remove used/checked conformances cache
2 parents 42d1c07 + 2a6f279 commit c3ff4d4

File tree

8 files changed

+27
-107
lines changed

8 files changed

+27
-107
lines changed

include/swift/Sema/ConstraintLocator.h

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ class TypeLoc;
3939
class VarDecl;
4040
class Pattern;
4141
class SourceManager;
42+
class ProtocolConformance;
4243

4344
namespace constraints {
4445

@@ -763,13 +764,13 @@ class LocatorPathElt::ArgumentAttribute final : public StoredIntegerElement<1> {
763764
};
764765

765766
class LocatorPathElt::ConformanceRequirement final
766-
: public StoredPointerElement<ProtocolDecl> {
767+
: public StoredPointerElement<ProtocolConformance> {
767768
public:
768-
ConformanceRequirement(ProtocolDecl *protocol)
769+
ConformanceRequirement(ProtocolConformance *conformance)
769770
: StoredPointerElement(PathElementKind::ConformanceRequirement,
770-
protocol) {}
771+
conformance) {}
771772

772-
ProtocolDecl *getRequirement() const { return getStoredPointer(); }
773+
ProtocolConformance *getConformance() const { return getStoredPointer(); }
773774

774775
static bool classof(const LocatorPathElt *elt) {
775776
return elt->getKind() == ConstraintLocator::ConformanceRequirement;

include/swift/Sema/ConstraintSystem.h

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1177,9 +1177,6 @@ class Solution {
11771177
llvm::SmallMapVector<const CaseLabelItem *, CaseLabelItemInfo, 4>
11781178
caseLabelItems;
11791179

1180-
std::vector<std::pair<ConstraintLocator *, ProtocolConformanceRef>>
1181-
Conformances;
1182-
11831180
/// The set of functions that have been transformed by a result builder.
11841181
llvm::MapVector<AnyFunctionRef, AppliedBuilderTransform>
11851182
resultBuilderTransformed;
@@ -1255,11 +1252,6 @@ class Solution {
12551252
return None;
12561253
}
12571254

1258-
/// Retrieve a fully-resolved protocol conformance at the given locator
1259-
/// and with the given protocol.
1260-
ProtocolConformanceRef resolveConformance(ConstraintLocator *locator,
1261-
ProtocolDecl *proto);
1262-
12631255
ConstraintLocator *getCalleeLocator(ConstraintLocator *locator,
12641256
bool lookThroughApply = true) const;
12651257

@@ -2209,9 +2201,6 @@ class ConstraintSystem {
22092201
/// each node had before introducing this type.
22102202
llvm::SmallVector<std::pair<ASTNode, Type>, 8> addedNodeTypes;
22112203

2212-
std::vector<std::pair<ConstraintLocator *, ProtocolConformanceRef>>
2213-
CheckedConformances;
2214-
22152204
/// The set of functions that have been transformed by a result builder.
22162205
std::vector<std::pair<AnyFunctionRef, AppliedBuilderTransform>>
22172206
resultBuilderTransformed;
@@ -2675,8 +2664,6 @@ class ConstraintSystem {
26752664

26762665
unsigned numAddedNodeTypes;
26772666

2678-
unsigned numCheckedConformances;
2679-
26802667
unsigned numDisabledConstraints;
26812668

26822669
unsigned numFavoredConstraints;
@@ -3885,12 +3872,6 @@ class ConstraintSystem {
38853872
const DeclRefExpr *base = nullptr,
38863873
OpenedTypeMap *replacements = nullptr);
38873874

3888-
/// Retrieve a list of conformances established along the current solver path.
3889-
ArrayRef<std::pair<ConstraintLocator *, ProtocolConformanceRef>>
3890-
getCheckedConformances() const {
3891-
return CheckedConformances;
3892-
}
3893-
38943875
/// Retrieve a list of generic parameter types solver has "opened" (replaced
38953876
/// with a type variable) along the current path.
38963877
ArrayRef<std::pair<ConstraintLocator *, ArrayRef<OpenedType>>>

lib/Sema/CSApply.cpp

Lines changed: 2 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -7967,12 +7967,8 @@ static Optional<SolutionApplicationTarget> applySolutionToForEachStmt(
79677967
auto stmt = forEachStmtInfo.stmt;
79687968
auto sequenceProto = TypeChecker::getProtocol(
79697969
cs.getASTContext(), stmt->getForLoc(), KnownProtocolKind::Sequence);
7970-
auto contextualLocator = solution.getConstraintLocator(
7971-
target.getAsExpr(),
7972-
{LocatorPathElt::ContextualType(),
7973-
LocatorPathElt::ConformanceRequirement(sequenceProto)});
7974-
auto sequenceConformance =
7975-
solution.resolveConformance(contextualLocator, sequenceProto);
7970+
auto sequenceConformance = TypeChecker::conformsToProtocol(
7971+
forEachStmtInfo.sequenceType, sequenceProto, cs.DC);
79767972
assert(!sequenceConformance.isInvalid() &&
79777973
"Couldn't find sequence conformance");
79787974

@@ -8381,34 +8377,6 @@ Expr *Solution::coerceToType(Expr *expr, Type toType,
83818377
return result;
83828378
}
83838379

8384-
ProtocolConformanceRef Solution::resolveConformance(
8385-
ConstraintLocator *locator, ProtocolDecl *proto) {
8386-
auto conformance = llvm::find_if(Conformances, [&locator](const auto &elt) {
8387-
return elt.first == locator;
8388-
});
8389-
8390-
if (conformance == Conformances.end())
8391-
return ProtocolConformanceRef::forInvalid();
8392-
8393-
// If the conformance doesn't require substitution, return it immediately.
8394-
auto conformanceRef = conformance->second;
8395-
if (conformanceRef.isAbstract())
8396-
return conformanceRef;
8397-
8398-
auto concrete = conformanceRef.getConcrete();
8399-
auto conformingType = concrete->getType();
8400-
if (!conformingType->hasTypeVariable())
8401-
return conformanceRef;
8402-
8403-
// Substitute into the conformance type, then look for a conformance
8404-
// again.
8405-
// FIXME: Should be able to perform the substitution using the Solution
8406-
// itself rather than another conforms-to-protocol check.
8407-
Type substConformingType = simplifyType(conformingType);
8408-
return TypeChecker::conformsToProtocol(substConformingType, proto,
8409-
constraintSystem->DC);
8410-
}
8411-
84128380
bool Solution::hasType(ASTNode node) const {
84138381
auto result = nodeTypes.find(node);
84148382
if (result != nodeTypes.end())

lib/Sema/CSDiagnostics.cpp

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -205,23 +205,14 @@ const Requirement &RequirementFailure::getRequirement() const {
205205

206206
ProtocolConformance *RequirementFailure::getConformanceForConditionalReq(
207207
ConstraintLocator *locator) {
208-
auto &solution = getSolution();
209208
auto reqElt = locator->castLastElementTo<LocatorPathElt::AnyRequirement>();
210209
if (!reqElt.isConditionalRequirement())
211210
return nullptr;
212211

213-
auto path = locator->getPath();
214-
auto *conformanceLoc = getConstraintLocator(getRawAnchor(), path.drop_back());
215-
216-
auto result = llvm::find_if(
217-
solution.Conformances,
218-
[&](const std::pair<ConstraintLocator *, ProtocolConformanceRef>
219-
&conformance) { return conformance.first == conformanceLoc; });
220-
assert(result != solution.Conformances.end());
221-
222-
auto conformance = result->second;
223-
assert(conformance.isConcrete());
224-
return conformance.getConcrete();
212+
auto conformanceRef =
213+
locator->findLast<LocatorPathElt::ConformanceRequirement>();
214+
assert(conformanceRef && "Invalid locator for a conditional requirement");
215+
return conformanceRef->getConformance();
225216
}
226217

227218
ValueDecl *RequirementFailure::getDeclRef() const {

lib/Sema/CSSimplify.cpp

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5721,18 +5721,17 @@ ConstraintSystem::SolutionKind ConstraintSystem::simplifyConformsToConstraint(
57215721
/// Record the given conformance as the result, adding any conditional
57225722
/// requirements if necessary.
57235723
auto recordConformance = [&](ProtocolConformanceRef conformance) {
5724-
auto *conformanceLoc = getConstraintLocator(
5725-
loc, LocatorPathElt::ConformanceRequirement(protocol));
5726-
// Record the conformance.
5727-
CheckedConformances.push_back({conformanceLoc, conformance});
5728-
5729-
if (isConformanceUnavailable(conformance, conformanceLoc))
5724+
if (isConformanceUnavailable(conformance, loc))
57305725
increaseScore(SK_Unavailable);
57315726

57325727
// This conformance may be conditional, in which case we need to consider
57335728
// those requirements as constraints too.
57345729
if (conformance.isConcrete()) {
57355730
unsigned index = 0;
5731+
auto *conformanceLoc = getConstraintLocator(
5732+
loc,
5733+
LocatorPathElt::ConformanceRequirement(conformance.getConcrete()));
5734+
57365735
for (const auto &req : conformance.getConditionalRequirements()) {
57375736
addConstraint(
57385737
req, getConstraintLocator(conformanceLoc,

lib/Sema/CSSolver.cpp

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -185,9 +185,6 @@ Solution ConstraintSystem::finalize() {
185185
solution.solutionApplicationTargets = solutionApplicationTargets;
186186
solution.caseLabelItems = caseLabelItems;
187187

188-
for (auto &e : CheckedConformances)
189-
solution.Conformances.push_back({e.first, e.second});
190-
191188
for (const auto &transformed : resultBuilderTransformed) {
192189
solution.resultBuilderTransformed.insert(transformed);
193190
}
@@ -273,10 +270,6 @@ void ConstraintSystem::applySolution(const Solution &solution) {
273270
setCaseLabelItemInfo(info.first, info.second);
274271
}
275272

276-
// Register the conformances checked along the way to arrive to solution.
277-
for (auto &conformance : solution.Conformances)
278-
CheckedConformances.push_back(conformance);
279-
280273
for (const auto &transformed : solution.resultBuilderTransformed) {
281274
resultBuilderTransformed.push_back(transformed);
282275
}
@@ -477,7 +470,6 @@ ConstraintSystem::SolverScope::SolverScope(ConstraintSystem &cs)
477470
numOpenedExistentialTypes = cs.OpenedExistentialTypes.size();
478471
numDefaultedConstraints = cs.DefaultedConstraints.size();
479472
numAddedNodeTypes = cs.addedNodeTypes.size();
480-
numCheckedConformances = cs.CheckedConformances.size();
481473
numDisabledConstraints = cs.solverState->getNumDisabledConstraints();
482474
numFavoredConstraints = cs.solverState->getNumFavoredConstraints();
483475
numResultBuilderTransformed = cs.resultBuilderTransformed.size();
@@ -555,9 +547,6 @@ ConstraintSystem::SolverScope::~SolverScope() {
555547
}
556548
truncate(cs.addedNodeTypes, numAddedNodeTypes);
557549

558-
// Remove any conformances checked along the current path.
559-
truncate(cs.CheckedConformances, numCheckedConformances);
560-
561550
/// Remove any builder transformed closures.
562551
truncate(cs.resultBuilderTransformed, numResultBuilderTransformed);
563552

lib/Sema/ConstraintLocator.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include "swift/AST/Decl.h"
1919
#include "swift/AST/Expr.h"
2020
#include "swift/AST/Types.h"
21+
#include "swift/AST/ProtocolConformance.h"
2122
#include "swift/Sema/ConstraintLocator.h"
2223
#include "swift/Sema/ConstraintSystem.h"
2324
#include "llvm/ADT/StringExtras.h"
@@ -399,9 +400,10 @@ void ConstraintLocator::dump(SourceManager *sm, raw_ostream &out) const {
399400
}
400401

401402
case ConformanceRequirement: {
402-
auto reqElt = elt.castTo<LocatorPathElt::ConformanceRequirement>();
403+
auto *conformance =
404+
elt.castTo<LocatorPathElt::ConformanceRequirement>().getConformance();
403405
out << "conformance requirement (";
404-
reqElt.getRequirement()->dumpRef(out);
406+
conformance->getProtocol()->dumpRef(out);
405407
out << ")";
406408
break;
407409
}

lib/Sema/ConstraintSystem.cpp

Lines changed: 7 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2903,8 +2903,7 @@ size_t Solution::getTotalMemory() const {
29032903
ConstraintRestrictions.getMemorySize() +
29042904
llvm::capacity_in_bytes(Fixes) + DisjunctionChoices.getMemorySize() +
29052905
OpenedTypes.getMemorySize() + OpenedExistentialTypes.getMemorySize() +
2906-
(DefaultedConstraints.size() * sizeof(void *)) +
2907-
Conformances.size() * sizeof(std::pair<ConstraintLocator *, ProtocolConformanceRef>);
2906+
(DefaultedConstraints.size() * sizeof(void *));
29082907
}
29092908

29102909
DeclContext *Solution::getDC() const { return constraintSystem->DC; }
@@ -5181,22 +5180,12 @@ static Optional<Requirement> getRequirement(ConstraintSystem &cs,
51815180
return None;
51825181

51835182
if (reqLoc->isConditionalRequirement()) {
5184-
auto path = reqLocator->getPath();
5185-
auto *conformanceLoc =
5186-
cs.getConstraintLocator(reqLocator->getAnchor(), path.drop_back());
5187-
5188-
auto conformances = cs.getCheckedConformances();
5189-
auto result = llvm::find_if(
5190-
conformances,
5191-
[&conformanceLoc](
5192-
const std::pair<ConstraintLocator *, ProtocolConformanceRef>
5193-
&conformance) { return conformance.first == conformanceLoc; });
5194-
assert(result != conformances.end());
5195-
5196-
auto conformance = result->second;
5197-
assert(conformance.isConcrete());
5198-
5199-
return conformance.getConditionalRequirements()[reqLoc->getIndex()];
5183+
auto conformanceRef =
5184+
reqLocator->findLast<LocatorPathElt::ConformanceRequirement>();
5185+
assert(conformanceRef && "Invalid locator for a conditional requirement");
5186+
5187+
auto conformance = conformanceRef->getConformance();
5188+
return conformance->getConditionalRequirements()[reqLoc->getIndex()];
52005189
}
52015190

52025191
if (auto openedGeneric =

0 commit comments

Comments
 (0)