Skip to content

Commit 642b458

Browse files
committed
[GSB] Use result of recordSameTypeConstraint() to short-circuit.
Centralizes the logic for short-circuiting based on same-type constraints.
1 parent bd0625f commit 642b458

File tree

2 files changed

+10
-18
lines changed

2 files changed

+10
-18
lines changed

include/swift/AST/GenericSignatureBuilder.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -215,8 +215,7 @@ class GenericSignatureBuilder {
215215
///
216216
/// \returns true if this same-type constraint merges two equivalence
217217
/// classes, and false otherwise.
218-
bool recordSameTypeConstraint(GenericSignatureBuilder &builder,
219-
PotentialArchetype *type1,
218+
bool recordSameTypeConstraint(PotentialArchetype *type1,
220219
PotentialArchetype *type2,
221220
const RequirementSource *source);
222221

lib/AST/GenericSignatureBuilder.cpp

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1642,14 +1642,13 @@ bool EquivalenceClass::recordConformanceConstraint(
16421642
}
16431643

16441644
bool EquivalenceClass::recordSameTypeConstraint(
1645-
GenericSignatureBuilder &builder,
16461645
PotentialArchetype *type1,
16471646
PotentialArchetype *type2,
16481647
const RequirementSource *source) {
1649-
// FIXME: Drop builder?
16501648
sameTypeConstraints.push_back({type1, type2, source});
16511649
++NumSameTypeConstraints;
1652-
return true;
1650+
return type1->getEquivalenceClassIfPresent() !=
1651+
type2->getEquivalenceClassIfPresent();
16531652
}
16541653

16551654
template<typename T>
@@ -3977,23 +3976,20 @@ GenericSignatureBuilder::addSameTypeRequirementBetweenArchetypes(
39773976
PotentialArchetype *OrigT2,
39783977
const RequirementSource *Source)
39793978
{
3979+
// Record the same-type constraint, and bail out if it was already known.
3980+
if (!OrigT1->getOrCreateEquivalenceClass(*this)
3981+
->recordSameTypeConstraint(OrigT1, OrigT2, Source))
3982+
return ConstraintResult::Resolved;
3983+
39803984
// Operate on the representatives
39813985
auto T1 = OrigT1->getRepresentative();
39823986
auto T2 = OrigT2->getRepresentative();
39833987

3984-
// If the representatives are already the same, we're done.
3985-
if (T1 == T2) {
3986-
T1->getOrCreateEquivalenceClass(*this)
3987-
->recordSameTypeConstraint(*this, OrigT1, OrigT2, Source);
3988-
return ConstraintResult::Resolved;
3989-
}
3990-
3991-
unsigned nestingDepth1 = T1->getNestingDepth();
3992-
unsigned nestingDepth2 = T2->getNestingDepth();
3993-
39943988
// Decide which potential archetype is to be considered the representative.
39953989
// We prefer potential archetypes with lower nesting depths, because it
39963990
// prevents us from unnecessarily building deeply nested potential archetypes.
3991+
unsigned nestingDepth1 = T1->getNestingDepth();
3992+
unsigned nestingDepth2 = T2->getNestingDepth();
39973993
if (nestingDepth2 < nestingDepth1) {
39983994
std::swap(T1, T2);
39993995
std::swap(OrigT1, OrigT2);
@@ -4003,9 +3999,6 @@ GenericSignatureBuilder::addSameTypeRequirementBetweenArchetypes(
40033999
auto equivClass = T1->getOrCreateEquivalenceClass(*this);
40044000
equivClass->modified(*this);
40054001

4006-
// Record the same-type constraint.
4007-
equivClass->recordSameTypeConstraint(*this, OrigT1, OrigT2, Source);
4008-
40094002
auto equivClass1Members = equivClass->members;
40104003
auto equivClass2Members = T2->getEquivalenceClassMembers();
40114004
for (auto equiv : equivClass2Members)

0 commit comments

Comments
 (0)