Skip to content

Commit e3488ce

Browse files
committed
RequirementMachine: Move decomposeTermIntoConformanceRuleLeftHandSides() to RewriteSystem
1 parent 2caca13 commit e3488ce

File tree

2 files changed

+25
-18
lines changed

2 files changed

+25
-18
lines changed

lib/AST/RequirementMachine/MinimalConformances.cpp

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -192,12 +192,6 @@ class MinimalConformances {
192192
// minimization domain.
193193
llvm::DenseSet<unsigned> &RedundantConformances;
194194

195-
void decomposeTermIntoConformanceRuleLeftHandSides(
196-
MutableTerm term,
197-
SmallVectorImpl<unsigned> &result) const;
198-
void decomposeTermIntoConformanceRuleLeftHandSides(
199-
MutableTerm term, unsigned ruleID,
200-
SmallVectorImpl<unsigned> &result) const;
201195

202196
bool isConformanceRuleRecoverable(
203197
llvm::SmallDenseSet<unsigned, 4> &visited,
@@ -252,18 +246,18 @@ class MinimalConformances {
252246
///
253247
/// The term should be irreducible, except for a protocol symbol at the end.
254248
void
255-
MinimalConformances::decomposeTermIntoConformanceRuleLeftHandSides(
249+
RewriteSystem::decomposeTermIntoConformanceRuleLeftHandSides(
256250
MutableTerm term, SmallVectorImpl<unsigned> &result) const {
257251
assert(term.back().getKind() == Symbol::Kind::Protocol);
258252

259253
// If T is canonical and T.[P] => T, then by confluence, T.[P]
260254
// reduces to T in a single step, via a rule V.[P] => V, where
261255
// T == U.V.
262256
RewritePath steps;
263-
bool simplified = System.simplify(term, &steps);
257+
bool simplified = simplify(term, &steps);
264258
if (!simplified) {
265259
llvm::errs() << "Term does not conform to protocol: " << term << "\n";
266-
System.dump(llvm::errs());
260+
dump(llvm::errs());
267261
abort();
268262
}
269263

@@ -273,7 +267,7 @@ MinimalConformances::decomposeTermIntoConformanceRuleLeftHandSides(
273267
const auto &step = *steps.begin();
274268

275269
#ifndef NDEBUG
276-
const auto &rule = System.getRule(step.getRuleID());
270+
const auto &rule = getRule(step.getRuleID());
277271
assert(rule.isAnyConformanceRule());
278272
assert(!rule.isIdentityConformanceRule());
279273
#endif
@@ -296,13 +290,13 @@ MinimalConformances::decomposeTermIntoConformanceRuleLeftHandSides(
296290
}
297291

298292
/// Given a term U and a rule (V.[P] => V), write U.[domain(V)] as a
299-
/// product of left hand sdies of conformance rules. The term U should
293+
/// product of left hand sides of conformance rules. The term U should
300294
/// be irreducible.
301295
void
302-
MinimalConformances::decomposeTermIntoConformanceRuleLeftHandSides(
296+
RewriteSystem::decomposeTermIntoConformanceRuleLeftHandSides(
303297
MutableTerm term, unsigned ruleID,
304298
SmallVectorImpl<unsigned> &result) const {
305-
const auto &rule = System.getRule(ruleID);
299+
const auto &rule = getRule(ruleID);
306300
assert(rule.isAnyConformanceRule());
307301
assert(!rule.isIdentityConformanceRule());
308302

@@ -416,7 +410,8 @@ void MinimalConformances::collectConformanceRules() {
416410
mutTerm.add(Symbol::forProtocol(parentProto, Context));
417411

418412
// Get a conformance path for X.[P] and record it.
419-
decomposeTermIntoConformanceRuleLeftHandSides(mutTerm, ParentPaths[ruleID]);
413+
System.decomposeTermIntoConformanceRuleLeftHandSides(
414+
mutTerm, ParentPaths[ruleID]);
420415
}
421416
}
422417

@@ -604,8 +599,8 @@ void MinimalConformances::computeCandidateConformancePaths() {
604599

605600
// Write U'.[domain(V)] as a product of left hand sides of protocol
606601
// conformance rules.
607-
decomposeTermIntoConformanceRuleLeftHandSides(term, pair.second,
608-
conformancePath);
602+
System.decomposeTermIntoConformanceRuleLeftHandSides(
603+
term, pair.second, conformancePath);
609604

610605
// This decomposition defines a conformance access path for each
611606
// conformance rule we saw in empty context.
@@ -947,7 +942,7 @@ void MinimalConformances::dumpMinimalConformances(
947942
/// already eliminated all redundant rewrite rules that are not
948943
/// conformance rules.
949944
void RewriteSystem::computeMinimalConformances(
950-
llvm::DenseSet<unsigned> &redundantConformances) {
945+
llvm::DenseSet<unsigned> &redundantConformances) const {
951946
MinimalConformances builder(*this, redundantConformances);
952947

953948
builder.collectConformanceRules();

lib/AST/RequirementMachine/RewriteSystem.h

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -371,8 +371,20 @@ class RewriteSystem final {
371371

372372
void performHomotopyReduction(EliminationPredicate isRedundantRuleFn);
373373

374+
public:
375+
// Utilities for minimal conformances algorithm, defined in
376+
// MinimalConformances.cpp.
377+
378+
void decomposeTermIntoConformanceRuleLeftHandSides(
379+
MutableTerm term,
380+
SmallVectorImpl<unsigned> &result) const;
381+
void decomposeTermIntoConformanceRuleLeftHandSides(
382+
MutableTerm term, unsigned ruleID,
383+
SmallVectorImpl<unsigned> &result) const;
384+
385+
private:
374386
void computeMinimalConformances(
375-
llvm::DenseSet<unsigned> &redundantConformances);
387+
llvm::DenseSet<unsigned> &redundantConformances) const;
376388

377389
public:
378390
void recordRewriteLoop(MutableTerm basepoint,

0 commit comments

Comments
 (0)