Skip to content

Commit 692dfed

Browse files
committed
[Constraint graph] Move constraint uniquing into gatherConstraints().
Simplify the interface to gatherConstraints() by performing the uniquing within the function itself and returning only the resulting (uniqued) vector of constraints. (cherry picked from commit 8355f3d)
1 parent d62c0c7 commit 692dfed

File tree

8 files changed

+66
-68
lines changed

8 files changed

+66
-68
lines changed

lib/Sema/CSBindings.cpp

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -209,14 +209,14 @@ bool ConstraintSystem::PotentialBindings::isViable(
209209
static bool hasNilLiteralConstraint(TypeVariableType *typeVar,
210210
ConstraintSystem &CS) {
211211
// Look for a literal-conformance constraint on the type variable.
212-
llvm::SetVector<Constraint *> constraints;
213-
CS.getConstraintGraph().gatherConstraints(
214-
typeVar, constraints, ConstraintGraph::GatheringKind::EquivalenceClass,
215-
[](Constraint *constraint) -> bool {
216-
return constraint->getKind() == ConstraintKind::LiteralConformsTo &&
217-
constraint->getProtocol()->isSpecificProtocol(
218-
KnownProtocolKind::ExpressibleByNilLiteral);
219-
});
212+
auto constraints =
213+
CS.getConstraintGraph().gatherConstraints(
214+
typeVar, ConstraintGraph::GatheringKind::EquivalenceClass,
215+
[](Constraint *constraint) -> bool {
216+
return constraint->getKind() == ConstraintKind::LiteralConformsTo &&
217+
constraint->getProtocol()->isSpecificProtocol(
218+
KnownProtocolKind::ExpressibleByNilLiteral);
219+
});
220220

221221
for (auto constraint : constraints)
222222
if (CS.simplifyType(constraint->getFirstType())->isEqual(typeVar))
@@ -392,9 +392,9 @@ ConstraintSystem::getPotentialBindings(TypeVariableType *typeVar) {
392392
}
393393

394394
// Gather the constraints associated with this type variable.
395-
llvm::SetVector<Constraint *> constraints;
396-
getConstraintGraph().gatherConstraints(
397-
typeVar, constraints, ConstraintGraph::GatheringKind::EquivalenceClass);
395+
auto constraints =
396+
getConstraintGraph().gatherConstraints(
397+
typeVar, ConstraintGraph::GatheringKind::EquivalenceClass);
398398

399399
PotentialBindings result(typeVar);
400400

lib/Sema/CSDiag.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7319,9 +7319,8 @@ bool FailureDiagnosis::diagnoseAmbiguousGenericParameters() {
73197319
// because type B would have no constraints associated with it.
73207320
unsigned numConstraints = 0;
73217321
{
7322-
llvm::SetVector<Constraint *> constraints;
7323-
CS.getConstraintGraph().gatherConstraints(
7324-
tv, constraints, ConstraintGraph::GatheringKind::EquivalenceClass,
7322+
auto constraints = CS.getConstraintGraph().gatherConstraints(
7323+
tv, ConstraintGraph::GatheringKind::EquivalenceClass,
73257324
[&](Constraint *constraint) -> bool {
73267325
// We are not interested in ConformsTo constraints because
73277326
// we can't derive any concrete type information from them.

lib/Sema/CSGen.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -532,9 +532,8 @@ namespace {
532532

533533
llvm::SmallSetVector<ProtocolDecl *, 2> literalProtos;
534534
if (auto argTypeVar = argTy->getAs<TypeVariableType>()) {
535-
llvm::SetVector<Constraint *> constraints;
536-
CS.getConstraintGraph().gatherConstraints(
537-
argTypeVar, constraints,
535+
auto constraints = CS.getConstraintGraph().gatherConstraints(
536+
argTypeVar,
538537
ConstraintGraph::GatheringKind::EquivalenceClass,
539538
[](Constraint *constraint) {
540539
return constraint->getKind() == ConstraintKind::LiteralConformsTo;

lib/Sema/CSSimplify.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6930,9 +6930,8 @@ ConstraintSystem::addKeyPathApplicationRootConstraint(Type root, ConstraintLocat
69306930
if (!typeVar)
69316931
return;
69326932

6933-
llvm::SetVector<Constraint *> constraints;
6934-
CG.gatherConstraints(
6935-
typeVar, constraints, ConstraintGraph::GatheringKind::EquivalenceClass,
6933+
auto constraints = CG.gatherConstraints(
6934+
typeVar, ConstraintGraph::GatheringKind::EquivalenceClass,
69366935
[&keyPathExpr](Constraint *constraint) -> bool {
69376936
return constraint->getKind() == ConstraintKind::KeyPath &&
69386937
constraint->getLocator()->getAnchor() == keyPathExpr;

lib/Sema/CSSolver.cpp

Lines changed: 23 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1494,9 +1494,8 @@ static Constraint *selectBestBindingDisjunction(
14941494
if (!firstBindDisjunction)
14951495
firstBindDisjunction = disjunction;
14961496

1497-
llvm::SetVector<Constraint *> constraints;
1498-
cs.getConstraintGraph().gatherConstraints(
1499-
typeVar, constraints, ConstraintGraph::GatheringKind::EquivalenceClass,
1497+
auto constraints = cs.getConstraintGraph().gatherConstraints(
1498+
typeVar, ConstraintGraph::GatheringKind::EquivalenceClass,
15001499
[](Constraint *constraint) {
15011500
return constraint->getKind() == ConstraintKind::Conversion;
15021501
});
@@ -1551,9 +1550,8 @@ void ConstraintSystem::ArgumentInfoCollector::walk(Type argType) {
15511550

15521551
visited.insert(rep);
15531552

1554-
llvm::SetVector<Constraint *> constraints;
1555-
CS.getConstraintGraph().gatherConstraints(
1556-
rep, constraints, ConstraintGraph::GatheringKind::EquivalenceClass);
1553+
auto constraints = CS.getConstraintGraph().gatherConstraints(
1554+
rep, ConstraintGraph::GatheringKind::EquivalenceClass);
15571555

15581556
for (auto *constraint : constraints) {
15591557
switch (constraint->getKind()) {
@@ -1747,9 +1745,8 @@ Constraint *ConstraintSystem::getUnboundBindOverloadDisjunction(
17471745
while (visitedVars.insert(rep).second) {
17481746
// Look for a disjunction that binds this type variable to an overload set.
17491747
TypeVariableType *optionalObjectTypeVar = nullptr;
1750-
llvm::SetVector<Constraint *> disjunctions;
1751-
getConstraintGraph().gatherConstraints(
1752-
rep, disjunctions, ConstraintGraph::GatheringKind::EquivalenceClass,
1748+
auto disjunctions = getConstraintGraph().gatherConstraints(
1749+
rep, ConstraintGraph::GatheringKind::EquivalenceClass,
17531750
[this, rep, &optionalObjectTypeVar](Constraint *match) {
17541751
// If we have an "optional object of" constraint where the right-hand
17551752
// side is this type variable, we may need to follow that type
@@ -1850,9 +1847,8 @@ void ConstraintSystem::sortDesignatedTypes(
18501847
SmallVectorImpl<NominalTypeDecl *> &nominalTypes,
18511848
Constraint *bindOverload) {
18521849
auto *tyvar = bindOverload->getFirstType()->castTo<TypeVariableType>();
1853-
llvm::SetVector<Constraint *> applicableFns;
1854-
getConstraintGraph().gatherConstraints(
1855-
tyvar, applicableFns, ConstraintGraph::GatheringKind::EquivalenceClass,
1850+
auto applicableFns = getConstraintGraph().gatherConstraints(
1851+
tyvar, ConstraintGraph::GatheringKind::EquivalenceClass,
18561852
[](Constraint *match) {
18571853
return match->getKind() == ConstraintKind::ApplicableFunction;
18581854
});
@@ -2266,21 +2262,21 @@ void DisjunctionChoice::propagateConversionInfo(ConstraintSystem &cs) const {
22662262
return;
22672263

22682264
auto conversionType = bindings.Bindings[0].BindingType;
2269-
llvm::SetVector<Constraint *> constraints;
2270-
cs.CG.gatherConstraints(typeVar, constraints,
2271-
ConstraintGraph::GatheringKind::EquivalenceClass,
2272-
[](Constraint *constraint) -> bool {
2273-
switch (constraint->getKind()) {
2274-
case ConstraintKind::Conversion:
2275-
case ConstraintKind::Defaultable:
2276-
case ConstraintKind::ConformsTo:
2277-
case ConstraintKind::LiteralConformsTo:
2278-
return false;
2279-
2280-
default:
2281-
return true;
2282-
}
2283-
});
2265+
auto constraints = cs.CG.gatherConstraints(
2266+
typeVar,
2267+
ConstraintGraph::GatheringKind::EquivalenceClass,
2268+
[](Constraint *constraint) -> bool {
2269+
switch (constraint->getKind()) {
2270+
case ConstraintKind::Conversion:
2271+
case ConstraintKind::Defaultable:
2272+
case ConstraintKind::ConformsTo:
2273+
case ConstraintKind::LiteralConformsTo:
2274+
return false;
2275+
2276+
default:
2277+
return true;
2278+
}
2279+
});
22842280

22852281
if (constraints.empty())
22862282
cs.addConstraint(ConstraintKind::Bind, typeVar, conversionType,

lib/Sema/ConstraintGraph.cpp

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -373,15 +373,14 @@ void ConstraintGraph::unbindTypeVariable(TypeVariableType *typeVar, Type fixed){
373373
}
374374
}
375375

376-
void ConstraintGraph::gatherConstraints(
377-
TypeVariableType *typeVar, llvm::SetVector<Constraint *> &constraints,
378-
GatheringKind kind,
376+
llvm::TinyPtrVector<Constraint *> ConstraintGraph::gatherConstraints(
377+
TypeVariableType *typeVar, GatheringKind kind,
379378
llvm::function_ref<bool(Constraint *)> acceptConstraint) {
380-
auto &reprNode = (*this)[CS.getRepresentative(typeVar)];
381-
auto equivClass = reprNode.getEquivalenceClass();
382-
llvm::SmallPtrSet<TypeVariableType *, 4> typeVars;
379+
llvm::TinyPtrVector<Constraint *> constraints;
383380

384381
/// Add constraints for the given adjacent type variable.
382+
llvm::SmallPtrSet<TypeVariableType *, 4> typeVars;
383+
llvm::SmallPtrSet<Constraint *, 4> visitedConstraints;
385384
auto addAdjacentConstraints = [&](TypeVariableType *adjTypeVar) {
386385
auto adjTypeVarsToVisit =
387386
(*this)[CS.getRepresentative(adjTypeVar)].getEquivalenceClass();
@@ -390,17 +389,23 @@ void ConstraintGraph::gatherConstraints(
390389
continue;
391390

392391
for (auto constraint : (*this)[adjTypeVarEquiv].getConstraints()) {
392+
if (!visitedConstraints.insert(constraint).second)
393+
continue;
394+
393395
if (acceptConstraint(constraint))
394-
constraints.insert(constraint);
396+
constraints.push_back(constraint);
395397
}
396398
}
397399
};
398400

401+
auto &reprNode = (*this)[CS.getRepresentative(typeVar)];
402+
auto equivClass = reprNode.getEquivalenceClass();
399403
for (auto typeVar : equivClass) {
400404
auto &node = (*this)[typeVar];
401405
for (auto constraint : node.getConstraints()) {
402-
if (acceptConstraint(constraint))
403-
constraints.insert(constraint);
406+
if (visitedConstraints.insert(constraint).second &&
407+
acceptConstraint(constraint))
408+
constraints.push_back(constraint);
404409

405410
// If we want all mentions, visit type variables within each of our
406411
// constraints.
@@ -417,6 +422,8 @@ void ConstraintGraph::gatherConstraints(
417422
addAdjacentConstraints(adjTypeVar);
418423
}
419424
}
425+
426+
return constraints;
420427
}
421428

422429
#pragma mark Algorithms

lib/Sema/ConstraintGraph.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -188,9 +188,8 @@ class ConstraintGraph {
188188
/// Gather the set of constraints that involve the given type variable,
189189
/// i.e., those constraints that will be affected when the type variable
190190
/// gets merged or bound to a fixed type.
191-
void
191+
llvm::TinyPtrVector<Constraint *>
192192
gatherConstraints(TypeVariableType *typeVar,
193-
llvm::SetVector<Constraint *> &constraints,
194193
GatheringKind kind,
195194
llvm::function_ref<bool(Constraint *)> acceptConstraint =
196195
[](Constraint *constraint) { return true; });

lib/Sema/ConstraintSystem.cpp

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -205,9 +205,8 @@ void ConstraintSystem::assignFixedType(TypeVariableType *typeVar, Type type,
205205
void ConstraintSystem::addTypeVariableConstraintsToWorkList(
206206
TypeVariableType *typeVar) {
207207
// Gather the constraints affected by a change to this type variable.
208-
llvm::SetVector<Constraint *> inactiveConstraints;
209-
CG.gatherConstraints(
210-
typeVar, inactiveConstraints, ConstraintGraph::GatheringKind::AllMentions,
208+
auto inactiveConstraints = CG.gatherConstraints(
209+
typeVar, ConstraintGraph::GatheringKind::AllMentions,
211210
[](Constraint *constraint) { return !constraint->isActive(); });
212211

213212
// Add any constraints that aren't already active to the worklist.
@@ -2020,13 +2019,13 @@ void ConstraintSystem::resolveOverload(ConstraintLocator *locator,
20202019
increaseScore(SK_KeyPathSubscript);
20212020

20222021
auto dynamicResultTy = boundType->castTo<TypeVariableType>();
2023-
llvm::SetVector<Constraint *> constraints;
2024-
CG.gatherConstraints(dynamicResultTy, constraints,
2025-
ConstraintGraph::GatheringKind::EquivalenceClass,
2026-
[](Constraint *constraint) {
2027-
return constraint->getKind() ==
2028-
ConstraintKind::ApplicableFunction;
2029-
});
2022+
auto constraints = CG.gatherConstraints(
2023+
dynamicResultTy,
2024+
ConstraintGraph::GatheringKind::EquivalenceClass,
2025+
[](Constraint *constraint) {
2026+
return constraint->getKind() ==
2027+
ConstraintKind::ApplicableFunction;
2028+
});
20302029

20312030
assert(constraints.size() == 1);
20322031
auto *applicableFn = constraints.front();

0 commit comments

Comments
 (0)