Skip to content

Commit afafede

Browse files
committed
RequirementMachine: Support for RewriteStep::Relation in computeNormalForm()
1 parent 86561b8 commit afafede

File tree

1 file changed

+37
-14
lines changed

1 file changed

+37
-14
lines changed

lib/AST/RequirementMachine/NormalizeRewritePath.cpp

Lines changed: 37 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,9 @@ bool RewriteStep::isInverseOf(const RewriteStep &other) const {
5757
case RewriteStep::Rule:
5858
return Arg == other.Arg;
5959

60+
case RewriteStep::Relation:
61+
return Arg == other.Arg;
62+
6063
default:
6164
return false;
6265
}
@@ -67,8 +70,7 @@ bool RewriteStep::isInverseOf(const RewriteStep &other) const {
6770

6871
bool RewriteStep::maybeSwapRewriteSteps(RewriteStep &other,
6972
const RewriteSystem &system) {
70-
if (Kind != RewriteStep::Rule ||
71-
other.Kind != RewriteStep::Rule)
73+
if (Kind != other.Kind)
7274
return false;
7375

7476
// Two rewrite steps are _orthogonal_ if they rewrite disjoint subterms
@@ -122,22 +124,43 @@ bool RewriteStep::maybeSwapRewriteSteps(RewriteStep &other,
122124
// other.StartOffset = |A|+|V|+|B|
123125
// other.EndOffset = |C|
124126

125-
const auto &rule = system.getRule(Arg);
126-
auto lhs = (Inverse ? rule.getRHS() : rule.getLHS());
127-
auto rhs = (Inverse ? rule.getLHS() : rule.getRHS());
127+
if (Kind == RewriteStep::Rule) {
128+
const auto &rule = system.getRule(Arg);
129+
auto lhs = (Inverse ? rule.getRHS() : rule.getLHS());
130+
auto rhs = (Inverse ? rule.getLHS() : rule.getRHS());
128131

129-
const auto &otherRule = system.getRule(other.Arg);
130-
auto otherLHS = (other.Inverse ? otherRule.getRHS() : otherRule.getLHS());
131-
auto otherRHS = (other.Inverse ? otherRule.getLHS() : otherRule.getRHS());
132+
const auto &otherRule = system.getRule(other.Arg);
133+
auto otherLHS = (other.Inverse ? otherRule.getRHS() : otherRule.getLHS());
134+
auto otherRHS = (other.Inverse ? otherRule.getLHS() : otherRule.getRHS());
132135

133-
if (StartOffset < other.StartOffset + otherLHS.size())
134-
return false;
136+
if (StartOffset < other.StartOffset + otherLHS.size())
137+
return false;
135138

136-
std::swap(*this, other);
137-
EndOffset += (lhs.size() - rhs.size());
138-
other.StartOffset += (otherRHS.size() - otherLHS.size());
139+
std::swap(*this, other);
140+
EndOffset += (lhs.size() - rhs.size());
141+
other.StartOffset += (otherRHS.size() - otherLHS.size());
139142

140-
return true;
143+
return true;
144+
} else if (Kind == RewriteStep::Relation) {
145+
const auto &relation = system.getRelation(Arg);
146+
auto lhs = (Inverse ? relation.second : relation.first);
147+
auto rhs = (Inverse ? relation.first : relation.second);
148+
149+
const auto &otherRelation = system.getRelation(other.Arg);
150+
auto otherLHS = (other.Inverse ? otherRelation.second : otherRelation.first);
151+
auto otherRHS = (other.Inverse ? otherRelation.first : otherRelation.second);
152+
153+
if (StartOffset < other.StartOffset + otherLHS.size())
154+
return false;
155+
156+
std::swap(*this, other);
157+
EndOffset += (lhs.size() - rhs.size());
158+
other.StartOffset += (otherRHS.size() - otherLHS.size());
159+
160+
return true;
161+
}
162+
163+
return false;
141164
}
142165

143166
/// Cancels out adjacent rewrite steps that are inverses of each other.

0 commit comments

Comments
 (0)