@@ -36,38 +36,49 @@ void RewritePath::invert() {
36
36
step.invert ();
37
37
}
38
38
39
- // / Dumps the rewrite step that was applied to \p term. Mutates \p term to
40
- // / reflect the application of the rule.
41
- void RewriteStep::dump (llvm::raw_ostream &out,
42
- MutableTerm &term,
43
- const RewriteSystem &system) const {
39
+ AppliedRewriteStep RewriteStep::apply (MutableTerm &term,
40
+ const RewriteSystem &system) const {
44
41
const auto &rule = system.getRule (RuleID);
45
42
46
43
auto lhs = (Inverse ? rule.getRHS () : rule.getLHS ());
47
44
auto rhs = (Inverse ? rule.getLHS () : rule.getRHS ());
48
45
49
- assert (std::equal (term.begin () + Offset,
50
- term.begin () + Offset + lhs.size (),
51
- lhs.begin ()));
46
+ if (!std::equal (term.begin () + Offset,
47
+ term.begin () + Offset + lhs.size (),
48
+ lhs.begin ())) {
49
+ llvm::errs () << " Invalid rewrite path\n " ;
50
+ llvm::errs () << " - Term: " << term << " \n " ;
51
+ llvm::errs () << " - Offset: " << Offset << " \n " ;
52
+ llvm::errs () << " - Expected subterm: " << lhs << " \n " ;
53
+ abort ();
54
+ }
52
55
53
56
MutableTerm prefix (term.begin (), term.begin () + Offset);
54
57
MutableTerm suffix (term.begin () + Offset + lhs.size (), term.end ());
55
58
56
- if (!prefix.empty ()) {
57
- out << prefix;
59
+ term = prefix;
60
+ term.append (rhs);
61
+ term.append (suffix);
62
+
63
+ return {lhs, rhs, prefix, suffix};
64
+ }
65
+
66
+ // / Dumps the rewrite step that was applied to \p term. Mutates \p term to
67
+ // / reflect the application of the rule.
68
+ void RewriteStep::dump (llvm::raw_ostream &out,
69
+ MutableTerm &term,
70
+ const RewriteSystem &system) const {
71
+ auto result = apply (term, system);
72
+
73
+ if (!result.prefix .empty ()) {
74
+ out << result.prefix ;
58
75
out << " ." ;
59
76
}
60
- out << " (" << rule.getLHS ();
61
- out << (Inverse ? " <= " : " => " );
62
- out << rule.getRHS () << " )" ;
63
- if (!suffix.empty ()) {
77
+ out << " (" << result.lhs << " => " << result.rhs << " )" ;
78
+ if (!result.suffix .empty ()) {
64
79
out << " ." ;
65
- out << suffix;
80
+ out << result. suffix ;
66
81
}
67
-
68
- term = prefix;
69
- term.append (rhs);
70
- term.append (suffix);
71
82
}
72
83
73
84
// / Dumps a series of rewrite steps applied to \p term.
@@ -377,7 +388,7 @@ void RewriteSystem::simplifyRewriteSystem() {
377
388
}
378
389
}
379
390
380
- void RewriteSystem::verify () const {
391
+ void RewriteSystem::verifyRewriteRules () const {
381
392
#ifndef NDEBUG
382
393
383
394
#define ASSERT_RULE (expr ) \
@@ -439,6 +450,25 @@ void RewriteSystem::verify() const {
439
450
#endif
440
451
}
441
452
453
+ void RewriteSystem::verifyHomotopyGenerators () const {
454
+ #ifndef NDEBUG
455
+ for (const auto &loop : HomotopyGenerators) {
456
+ auto term = loop.first ;
457
+
458
+ for (const auto &step : loop.second ) {
459
+ (void ) step.apply (term, *this );
460
+ }
461
+
462
+ if (term != loop.first ) {
463
+ llvm::errs () << " Not a loop: " ;
464
+ loop.second .dump (llvm::errs (), loop.first , *this );
465
+ llvm::errs () << " \n " ;
466
+ abort ();
467
+ }
468
+ }
469
+ #endif
470
+ }
471
+
442
472
void RewriteSystem::dump (llvm::raw_ostream &out) const {
443
473
out << " Rewrite system: {\n " ;
444
474
for (const auto &rule : Rules) {
0 commit comments