Skip to content

Commit 8355f3d

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.
1 parent dfdd352 commit 8355f3d

8 files changed

+66
-68
lines changed

lib/Sema/CSBindings.cpp

+11-11
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

+2-3
Original file line numberDiff line numberDiff line change
@@ -6929,9 +6929,8 @@ bool FailureDiagnosis::diagnoseAmbiguousGenericParameters() {
69296929
// because type B would have no constraints associated with it.
69306930
unsigned numConstraints = 0;
69316931
{
6932-
llvm::SetVector<Constraint *> constraints;
6933-
CS.getConstraintGraph().gatherConstraints(
6934-
tv, constraints, ConstraintGraph::GatheringKind::EquivalenceClass,
6932+
auto constraints = CS.getConstraintGraph().gatherConstraints(
6933+
tv, ConstraintGraph::GatheringKind::EquivalenceClass,
69356934
[&](Constraint *constraint) -> bool {
69366935
// We are not interested in ConformsTo constraints because
69376936
// we can't derive any concrete type information from them.

lib/Sema/CSGen.cpp

+2-3
Original file line numberDiff line numberDiff line change
@@ -533,9 +533,8 @@ namespace {
533533

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

lib/Sema/CSSimplify.cpp

+2-3
Original file line numberDiff line numberDiff line change
@@ -7133,9 +7133,8 @@ ConstraintSystem::addKeyPathApplicationRootConstraint(Type root, ConstraintLocat
71337133
if (!typeVar)
71347134
return;
71357135

7136-
llvm::SetVector<Constraint *> constraints;
7137-
CG.gatherConstraints(
7138-
typeVar, constraints, ConstraintGraph::GatheringKind::EquivalenceClass,
7136+
auto constraints = CG.gatherConstraints(
7137+
typeVar, ConstraintGraph::GatheringKind::EquivalenceClass,
71397138
[&keyPathExpr](Constraint *constraint) -> bool {
71407139
return constraint->getKind() == ConstraintKind::KeyPath &&
71417140
constraint->getLocator()->getAnchor() == keyPathExpr;

lib/Sema/CSSolver.cpp

+23-27
Original file line numberDiff line numberDiff line change
@@ -1519,9 +1519,8 @@ static Constraint *selectBestBindingDisjunction(
15191519
if (!firstBindDisjunction)
15201520
firstBindDisjunction = disjunction;
15211521

1522-
llvm::SetVector<Constraint *> constraints;
1523-
cs.getConstraintGraph().gatherConstraints(
1524-
typeVar, constraints, ConstraintGraph::GatheringKind::EquivalenceClass,
1522+
auto constraints = cs.getConstraintGraph().gatherConstraints(
1523+
typeVar, ConstraintGraph::GatheringKind::EquivalenceClass,
15251524
[](Constraint *constraint) {
15261525
return constraint->getKind() == ConstraintKind::Conversion;
15271526
});
@@ -1576,9 +1575,8 @@ void ConstraintSystem::ArgumentInfoCollector::walk(Type argType) {
15761575

15771576
visited.insert(rep);
15781577

1579-
llvm::SetVector<Constraint *> constraints;
1580-
CS.getConstraintGraph().gatherConstraints(
1581-
rep, constraints, ConstraintGraph::GatheringKind::EquivalenceClass);
1578+
auto constraints = CS.getConstraintGraph().gatherConstraints(
1579+
rep, ConstraintGraph::GatheringKind::EquivalenceClass);
15821580

15831581
for (auto *constraint : constraints) {
15841582
switch (constraint->getKind()) {
@@ -1772,9 +1770,8 @@ Constraint *ConstraintSystem::getUnboundBindOverloadDisjunction(
17721770
while (visitedVars.insert(rep).second) {
17731771
// Look for a disjunction that binds this type variable to an overload set.
17741772
TypeVariableType *optionalObjectTypeVar = nullptr;
1775-
llvm::SetVector<Constraint *> disjunctions;
1776-
getConstraintGraph().gatherConstraints(
1777-
rep, disjunctions, ConstraintGraph::GatheringKind::EquivalenceClass,
1773+
auto disjunctions = getConstraintGraph().gatherConstraints(
1774+
rep, ConstraintGraph::GatheringKind::EquivalenceClass,
17781775
[this, rep, &optionalObjectTypeVar](Constraint *match) {
17791776
// If we have an "optional object of" constraint where the right-hand
17801777
// side is this type variable, we may need to follow that type
@@ -1875,9 +1872,8 @@ void ConstraintSystem::sortDesignatedTypes(
18751872
SmallVectorImpl<NominalTypeDecl *> &nominalTypes,
18761873
Constraint *bindOverload) {
18771874
auto *tyvar = bindOverload->getFirstType()->castTo<TypeVariableType>();
1878-
llvm::SetVector<Constraint *> applicableFns;
1879-
getConstraintGraph().gatherConstraints(
1880-
tyvar, applicableFns, ConstraintGraph::GatheringKind::EquivalenceClass,
1875+
auto applicableFns = getConstraintGraph().gatherConstraints(
1876+
tyvar, ConstraintGraph::GatheringKind::EquivalenceClass,
18811877
[](Constraint *match) {
18821878
return match->getKind() == ConstraintKind::ApplicableFunction;
18831879
});
@@ -2292,21 +2288,21 @@ void DisjunctionChoice::propagateConversionInfo(ConstraintSystem &cs) const {
22922288
return;
22932289

22942290
auto conversionType = bindings.Bindings[0].BindingType;
2295-
llvm::SetVector<Constraint *> constraints;
2296-
cs.CG.gatherConstraints(typeVar, constraints,
2297-
ConstraintGraph::GatheringKind::EquivalenceClass,
2298-
[](Constraint *constraint) -> bool {
2299-
switch (constraint->getKind()) {
2300-
case ConstraintKind::Conversion:
2301-
case ConstraintKind::Defaultable:
2302-
case ConstraintKind::ConformsTo:
2303-
case ConstraintKind::LiteralConformsTo:
2304-
return false;
2305-
2306-
default:
2307-
return true;
2308-
}
2309-
});
2291+
auto constraints = cs.CG.gatherConstraints(
2292+
typeVar,
2293+
ConstraintGraph::GatheringKind::EquivalenceClass,
2294+
[](Constraint *constraint) -> bool {
2295+
switch (constraint->getKind()) {
2296+
case ConstraintKind::Conversion:
2297+
case ConstraintKind::Defaultable:
2298+
case ConstraintKind::ConformsTo:
2299+
case ConstraintKind::LiteralConformsTo:
2300+
return false;
2301+
2302+
default:
2303+
return true;
2304+
}
2305+
});
23102306

23112307
if (constraints.empty())
23122308
cs.addConstraint(ConstraintKind::Bind, typeVar, conversionType,

lib/Sema/ConstraintGraph.cpp

+16-9
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

+1-2
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

+9-10
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.
@@ -1985,13 +1984,13 @@ void ConstraintSystem::resolveOverload(ConstraintLocator *locator,
19851984
increaseScore(SK_KeyPathSubscript);
19861985

19871986
auto dynamicResultTy = boundType->castTo<TypeVariableType>();
1988-
llvm::SetVector<Constraint *> constraints;
1989-
CG.gatherConstraints(dynamicResultTy, constraints,
1990-
ConstraintGraph::GatheringKind::EquivalenceClass,
1991-
[](Constraint *constraint) {
1992-
return constraint->getKind() ==
1993-
ConstraintKind::ApplicableFunction;
1994-
});
1987+
auto constraints = CG.gatherConstraints(
1988+
dynamicResultTy,
1989+
ConstraintGraph::GatheringKind::EquivalenceClass,
1990+
[](Constraint *constraint) {
1991+
return constraint->getKind() ==
1992+
ConstraintKind::ApplicableFunction;
1993+
});
19951994

19961995
assert(constraints.size() == 1);
19971996
auto *applicableFn = constraints.front();

0 commit comments

Comments
 (0)