@@ -128,74 +128,6 @@ void ConstraintGraphNode::removeConstraint(Constraint *constraint) {
128
128
Constraints.pop_back ();
129
129
}
130
130
131
- ConstraintGraphNode::Adjacency &
132
- ConstraintGraphNode::getAdjacency (TypeVariableType *typeVar) {
133
- assert (typeVar != TypeVar && " Cannot be adjacent to oneself" );
134
-
135
- // Look for existing adjacency information.
136
- auto pos = AdjacencyInfo.find (typeVar);
137
-
138
- if (pos != AdjacencyInfo.end ())
139
- return pos->second ;
140
-
141
- // If we weren't already adjacent to this type variable, add it to the
142
- // list of adjacencies.
143
- pos = AdjacencyInfo.insert (
144
- { typeVar, { static_cast <unsigned >(Adjacencies.size ()), 0 } })
145
- .first ;
146
- Adjacencies.push_back (typeVar);
147
- return pos->second ;
148
- }
149
-
150
- void ConstraintGraphNode::modifyAdjacency (
151
- TypeVariableType *typeVar,
152
- llvm::function_ref<void (Adjacency& adj)> modify) {
153
- // Find the adjacency information.
154
- auto pos = AdjacencyInfo.find (typeVar);
155
- assert (pos != AdjacencyInfo.end () && " Type variables not adjacent" );
156
- assert (Adjacencies[pos->second .Index ] == typeVar && " Mismatched adjacency" );
157
-
158
- // Perform the modification .
159
- modify (pos->second );
160
-
161
- // If the adjacency is not empty, leave the information in there.
162
- if (!pos->second .empty ())
163
- return ;
164
-
165
- // Remove this adjacency from the mapping.
166
- unsigned index = pos->second .Index ;
167
- AdjacencyInfo.erase (pos);
168
-
169
- // If this adjacency is last in the vector, just pop it off.
170
- unsigned lastIndex = Adjacencies.size ()-1 ;
171
- if (index == lastIndex) {
172
- Adjacencies.pop_back ();
173
- return ;
174
- }
175
-
176
- // This adjacency is somewhere in the middle; swap it with the last
177
- // adjacency so we can remove the adjacency from the vector in O(1) time
178
- // rather than O(n) time.
179
- auto lastTypeVar = Adjacencies[lastIndex];
180
- Adjacencies[index] = lastTypeVar;
181
- AdjacencyInfo[lastTypeVar].Index = index;
182
- Adjacencies.pop_back ();
183
- }
184
-
185
- void ConstraintGraphNode::addAdjacency (TypeVariableType *typeVar) {
186
- auto &adjacency = getAdjacency (typeVar);
187
-
188
- // Bump the degree of the adjacency.
189
- ++adjacency.NumConstraints ;
190
- }
191
-
192
- void ConstraintGraphNode::removeAdjacency (TypeVariableType *typeVar) {
193
- modifyAdjacency (typeVar, [](Adjacency &adj) {
194
- assert (adj.NumConstraints > 0 && " No adjacency to remove?" );
195
- --adj.NumConstraints ;
196
- });
197
- }
198
-
199
131
void ConstraintGraphNode::addToEquivalenceClass (
200
132
ArrayRef<TypeVariableType *> typeVars) {
201
133
assert (TypeVar == TypeVar->getImpl ().getRepresentative (nullptr ) &&
@@ -326,80 +258,52 @@ void ConstraintGraph::removeNode(TypeVariableType *typeVar) {
326
258
TypeVariables.pop_back ();
327
259
}
328
260
329
- // / Enumerate the adjacency edges for the given constraint.
330
- static void enumerateAdjacencies (
331
- Constraint *constraint,
332
- llvm::function_ref<void (TypeVariableType *, TypeVariableType *)> visitor) {
333
- // Don't record adjacencies for one-way constraints.
334
- if (constraint->isOneWayConstraint ())
335
- return ;
336
-
337
- // O(N^2) update for all of the adjacent type variables.
261
+ void ConstraintGraph::addConstraint (Constraint *constraint) {
262
+ // For the nodes corresponding to each type variable...
338
263
auto referencedTypeVars = constraint->getTypeVariables ();
339
264
for (auto typeVar : referencedTypeVars) {
340
- for (auto otherTypeVar : referencedTypeVars) {
341
- if (typeVar == otherTypeVar)
342
- continue ;
265
+ // Find the node for this type variable.
266
+ auto &node = (*this )[typeVar];
343
267
344
- visitor (typeVar, otherTypeVar);
345
- }
268
+ // Note the constraint within the node for that type variable.
269
+ node. addConstraint (constraint);
346
270
}
347
- }
348
271
349
- void ConstraintGraph::addConstraint (Constraint *constraint) {
350
- // Record the change, if there are active scopes.
351
- if (ActiveScope) {
352
- Changes.push_back (Change::addedConstraint (constraint));
353
- }
354
-
355
- if (constraint->getTypeVariables ().empty ()) {
356
- // A constraint that doesn't reference any type variables is orphaned;
357
- // track it as such.
272
+ // If the constraint doesn't reference any type variables, it's orphaned;
273
+ // track it as such.
274
+ if (referencedTypeVars.empty ()) {
358
275
OrphanedConstraints.push_back (constraint);
359
- return ;
360
- }
361
-
362
- // Record this constraint in each type variable.
363
- for (auto typeVar : constraint->getTypeVariables ()) {
364
- (*this )[typeVar].addConstraint (constraint);
365
276
}
366
277
367
- // Record adjacencies.
368
- enumerateAdjacencies (constraint,
369
- [&](TypeVariableType *lhs, TypeVariableType *rhs) {
370
- assert (lhs != rhs);
371
- (*this )[lhs].addAdjacency (rhs);
372
- });
278
+ // Record the change, if there are active scopes.
279
+ if (ActiveScope)
280
+ Changes.push_back (Change::addedConstraint (constraint));
373
281
}
374
282
375
283
void ConstraintGraph::removeConstraint (Constraint *constraint) {
376
- // Record the change, if there are active scopes.
377
- if (ActiveScope)
378
- Changes.push_back (Change::removedConstraint (constraint));
284
+ // For the nodes corresponding to each type variable...
285
+ auto referencedTypeVars = constraint->getTypeVariables ();
286
+ for (auto typeVar : referencedTypeVars) {
287
+ // Find the node for this type variable.
288
+ auto &node = (*this )[typeVar];
289
+
290
+ // Remove the constraint.
291
+ node.removeConstraint (constraint);
292
+ }
379
293
380
- if (constraint->getTypeVariables ().empty ()) {
381
- // A constraint that doesn't reference any type variables is orphaned;
382
- // remove it from the list of orphaned constraints.
294
+ // If this is an orphaned constraint, remove it from the list.
295
+ if (referencedTypeVars.empty ()) {
383
296
auto known = std::find (OrphanedConstraints.begin (),
384
297
OrphanedConstraints.end (),
385
298
constraint);
386
299
assert (known != OrphanedConstraints.end () && " missing orphaned constraint" );
387
300
*known = OrphanedConstraints.back ();
388
301
OrphanedConstraints.pop_back ();
389
- return ;
390
302
}
391
303
392
- // Remove the constraint from each type variable.
393
- for (auto typeVar : constraint->getTypeVariables ()) {
394
- (*this )[typeVar].removeConstraint (constraint);
395
- }
396
-
397
- // Remove all adjacencies for all type variables.
398
- enumerateAdjacencies (constraint,
399
- [&](TypeVariableType *lhs, TypeVariableType *rhs) {
400
- assert (lhs != rhs);
401
- (*this )[lhs].removeAdjacency (rhs);
402
- });
304
+ // Record the change, if there are active scopes.
305
+ if (ActiveScope)
306
+ Changes.push_back (Change::removedConstraint (constraint));
403
307
}
404
308
405
309
void ConstraintGraph::mergeNodes (TypeVariableType *typeVar1,
@@ -1335,28 +1239,6 @@ void ConstraintGraphNode::print(llvm::raw_ostream &out, unsigned indent,
1335
1239
}
1336
1240
}
1337
1241
1338
- if (!Adjacencies.empty ()) {
1339
- out.indent (indent + 2 );
1340
- out << " Adjacencies:" ;
1341
- SmallVector<TypeVariableType *, 4 > sortedAdjacencies (Adjacencies.begin (),
1342
- Adjacencies.end ());
1343
- std::sort (sortedAdjacencies.begin (), sortedAdjacencies.end (),
1344
- [](TypeVariableType *lhs, TypeVariableType *rhs) {
1345
- return lhs->getID () < rhs->getID ();
1346
- });
1347
- for (auto adj : sortedAdjacencies) {
1348
- out << ' ' ;
1349
- adj->print (out, PO);
1350
-
1351
- const auto info = AdjacencyInfo.lookup (adj);
1352
- auto degree = info.NumConstraints ;
1353
- if (degree > 1 ) {
1354
- out << " (" << degree << " )" ;
1355
- }
1356
- }
1357
- out << " \n " ;
1358
- }
1359
-
1360
1242
// Print fixed bindings.
1361
1243
if (!FixedBindings.empty ()) {
1362
1244
out.indent (indent + 2 );
@@ -1526,69 +1408,6 @@ void ConstraintGraphNode::verify(ConstraintGraph &cg) {
1526
1408
requireSameValue (info.first , Constraints[info.second ],
1527
1409
" constraint map provides wrong index into vector" );
1528
1410
}
1529
-
1530
- // Verify that the adjacency map/vector haven't gotten out of sync.
1531
- requireSameValue (Adjacencies.size (), AdjacencyInfo.size (),
1532
- " adjacency vector and map have different sizes" );
1533
- for (auto info : AdjacencyInfo) {
1534
- require (info.second .Index < Adjacencies.size (),
1535
- " adjacency index out-of-range" );
1536
- requireSameValue (info.first , Adjacencies[info.second .Index ],
1537
- " adjacency map provides wrong index into vector" );
1538
- require (!info.second .empty (),
1539
- " adjacency information should have been removed" );
1540
- require (info.second .NumConstraints <= Constraints.size (),
1541
- " adjacency information has higher degree than # of constraints" );
1542
- }
1543
-
1544
- // Based on the constraints we have, build up a representation of what
1545
- // we expect the adjacencies to look like.
1546
- llvm::DenseMap<TypeVariableType *, unsigned > expectedAdjacencies;
1547
- for (auto constraint : Constraints) {
1548
- if (constraint->isOneWayConstraint ())
1549
- continue ;
1550
-
1551
- for (auto adjTypeVar : constraint->getTypeVariables ()) {
1552
- if (adjTypeVar == TypeVar)
1553
- continue ;
1554
-
1555
- ++expectedAdjacencies[adjTypeVar];
1556
- }
1557
- }
1558
-
1559
- // Make sure that the adjacencies we expect are the adjacencies we have.
1560
- PrintOptions PO;
1561
- PO.PrintTypesForDebugging = true ;
1562
- for (auto adj : expectedAdjacencies) {
1563
- auto knownAdj = AdjacencyInfo.find (adj.first );
1564
- requireWithContext (knownAdj != AdjacencyInfo.end (),
1565
- " missing adjacency information for type variable" ,
1566
- [&] {
1567
- llvm::dbgs () << " type variable=" << adj.first ->getString (PO) << ' n' ;
1568
- });
1569
-
1570
- requireWithContext (adj.second == knownAdj->second .NumConstraints ,
1571
- " wrong number of adjacencies for type variable" ,
1572
- [&] {
1573
- llvm::dbgs () << " type variable=" << adj.first ->getString (PO)
1574
- << " (" << adj.second << " vs. "
1575
- << knownAdj->second .NumConstraints
1576
- << " )\n " ;
1577
- });
1578
- }
1579
-
1580
- if (AdjacencyInfo.size () != expectedAdjacencies.size ()) {
1581
- // The adjacency information has something extra in it. Find the
1582
- // extraneous type variable.
1583
- for (auto adj : AdjacencyInfo) {
1584
- requireWithContext (AdjacencyInfo.count (adj.first ) > 0 ,
1585
- " extraneous adjacency info for type variable" ,
1586
- [&] {
1587
- llvm::dbgs () << " type variable=" << adj.first ->getString (PO) << ' \n ' ;
1588
- });
1589
- }
1590
- }
1591
-
1592
1411
#undef requireSameValue
1593
1412
#undef requireWithContext
1594
1413
#undef require
0 commit comments