Skip to content

Commit dde8e12

Browse files
authored
Optimisation: Choice(In(A),In(B)) -> In(A,B) (#65)
Optimisation: Choice(In(A),In(B)) -> In(A,B). About 6% saving on one ACI benchmark. Not done with any statistical rigour, but clearly a good optimisation.
1 parent 96ced38 commit dde8e12

16 files changed

+81
-88
lines changed

src/passes/absolute_refs.cc

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ namespace rego
6969
PassDef absolute_refs()
7070
{
7171
return {
72-
(In(RefTerm) / In(RuleRef)) * T(Var)[Var]([](auto& n) {
72+
In(RefTerm, RuleRef) * T(Var)[Var]([](auto& n) {
7373
return is_ref_to_type(*n.first, {Import});
7474
}) >>
7575
[](Match& _) {
@@ -80,7 +80,7 @@ namespace rego
8080
return ref->clone();
8181
},
8282

83-
(In(RefTerm) / In(RuleRef)) *
83+
In(RefTerm, RuleRef) *
8484
(T(Ref)
8585
<< ((T(RefHead) << T(Var)[Var](
8686
[](auto& n) { return is_ref_to_type(*n.first, {Import}); })) *
@@ -97,7 +97,7 @@ namespace rego
9797
return Ref << refhead << refargseq;
9898
},
9999

100-
(In(RefTerm) / In(RuleRef)) * T(Var)[Var]([](auto& n) {
100+
In(RefTerm, RuleRef) * T(Var)[Var]([](auto& n) {
101101
return is_ref_to_type(*n.first, RuleTypes);
102102
}) >>
103103
[](Match& _) {
@@ -107,7 +107,7 @@ namespace rego
107107
return build_ref(rule);
108108
},
109109

110-
(In(RefTerm) / In(RuleRef)) *
110+
In(RefTerm, RuleRef) *
111111
(T(Ref)
112112
<< ((T(RefHead) << T(Var)[Var]([](auto& n) {
113113
return is_ref_to_type(*n.first, RuleTypes);

src/passes/assign.cc

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -196,8 +196,7 @@ namespace rego
196196
In(Expr) * T(Unify)[Unify] >>
197197
[](Match& _) { return err(_(Unify), "Invalid assignment"); },
198198

199-
(In(RuleComp) / In(RuleFunc) / In(RuleSet) / In(RuleObj)) *
200-
T(Expr)[Expr] >>
199+
In(RuleComp, RuleFunc, RuleSet, RuleObj) * T(Expr)[Expr] >>
201200
[](Match& _) { return err(_(Expr), "Invalid rule value"); },
202201

203202
In(Expr) * (T(Set) / T(SetCompr))[Set] >>

src/passes/build_refs.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ namespace rego
4242
<< (RefArgSeq << (RefArgBrack << _(Arg)));
4343
},
4444

45-
(In(Group) / In(RuleRef)) *
45+
In(Group, RuleRef) *
4646
((T(Ref) << (T(RefHead)[RefHead] * T(RefArgSeq)[RefArgSeq])) *
4747
T(Dot) * T(Var)[Rhs]) >>
4848
[](Match& _) {

src/passes/comparison.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ namespace rego
4747
In(RefArgBrack) * (T(Term) << RefArgBrackArg[Arg]) >>
4848
[](Match& _) { return _(Arg); },
4949

50-
(In(ArithArg) / In(BoolArg)) * (T(Expr) << ArithInfixArg[Val]) >>
50+
In(ArithArg, BoolArg) * (T(Expr) << ArithInfixArg[Val]) >>
5151
[](Match& _) { return _(Val); },
5252

5353
// errors

src/passes/compr.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ namespace rego
111111
<< body))))));
112112
},
113113

114-
(In(ArrayCompr) / In(SetCompr)) *
114+
In(ArrayCompr, SetCompr) *
115115
(T(Expr)[Expr] * T(NestedBody)[NestedBody]) >>
116116
[](Match& _) {
117117
Location out = _.fresh({"out"});

src/passes/constants.cc

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,11 @@ namespace rego
1010
PassDef constants()
1111
{
1212
return {
13-
(In(RuleComp) / In(RuleFunc) / In(RuleSet) / In(DefaultRule)) *
13+
In(RuleComp, RuleFunc, RuleSet, DefaultRule) *
1414
T(Term)[Term]([](auto& n) { return is_constant(*n.first); }) >>
1515
[](Match& _) { return DataTerm << *_[Term]; },
1616

17-
(In(RuleComp) / In(RuleFunc)) *
17+
In(RuleComp, RuleFunc) *
1818
T(Term)[Term]([](auto& n) { return !is_constant(*n.first); }) >>
1919
[](Match& _) {
2020
Location value = _.fresh({"value"});
@@ -58,16 +58,16 @@ namespace rego
5858
In(DataTerm) * T(Object)[Object] >>
5959
[](Match& _) { return DataObject << *_[Object]; },
6060

61-
(In(DataArray) / In(DataSet)) * (T(Expr) << T(Expr)[Expr]) >>
61+
In(DataArray, DataSet) * (T(Expr) << T(Expr)[Expr]) >>
6262
[](Match& _) { return _(Expr); },
6363

64-
(In(DataArray) / In(DataSet)) * (T(Expr) << T(Term)[Term]) >>
64+
In(DataArray, DataSet) * (T(Expr) << T(Term)[Term]) >>
6565
[](Match& _) { return DataTerm << _(Term)->front(); },
6666

67-
(In(DataArray) / In(DataSet)) * (T(Expr) << T(Set)[Set]) >>
67+
In(DataArray, DataSet) * (T(Expr) << T(Set)[Set]) >>
6868
[](Match& _) { return DataTerm << _(Set); },
6969

70-
(In(DataArray) / In(DataSet)) * (T(Expr) << T(NumTerm)[NumTerm]) >>
70+
In(DataArray, DataSet) * (T(Expr) << T(NumTerm)[NumTerm]) >>
7171
[](Match& _) { return DataTerm << (Scalar << _(NumTerm)->front()); },
7272

7373
In(DataObject) *

src/passes/functions.cc

Lines changed: 27 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,13 @@ namespace rego
2222
In(Input) * T(DataTerm)[DataTerm] >>
2323
[](Match& _) { return Term << *_[DataTerm]; },
2424

25-
(In(UnifyExpr) / In(ArgSeq)) * (T(Expr) << Any[Val]) >>
25+
In(UnifyExpr, ArgSeq) * (T(Expr) << Any[Val]) >>
2626
[](Match& _) { return _(Val); },
2727

28-
(In(UnifyExpr) / In(ArgSeq)) * (T(Term) << T(Scalar)[Scalar]) >>
28+
In(UnifyExpr, ArgSeq) * (T(Term) << T(Scalar)[Scalar]) >>
2929
[](Match& _) { return _(Scalar); },
3030

31-
(In(UnifyExpr) / In(ArgSeq)) * (T(Term) << T(Object)[Object]) >>
31+
In(UnifyExpr, ArgSeq) * (T(Term) << T(Object)[Object]) >>
3232
[](Match& _) {
3333
Node seq = NodeDef::create(Seq);
3434
Location temp = _.fresh({"obj"});
@@ -47,31 +47,31 @@ namespace rego
4747

4848
In(ArgSeq) * T(Set)[Set] >> [](Match& _) { return Term << _(Set); },
4949

50-
(In(UnifyExpr) / In(ArgSeq)) * T(ObjectItem)[ObjectItem] >>
50+
In(UnifyExpr, ArgSeq) * T(ObjectItem)[ObjectItem] >>
5151
[](Match& _) { return Seq << *_[ObjectItem]; },
5252

53-
(In(UnifyExpr) / In(ArgSeq)) * (T(Enumerate) << T(Expr)[Expr]) >>
53+
In(UnifyExpr, ArgSeq) * (T(Enumerate) << T(Expr)[Expr]) >>
5454
[](Match& _) {
5555
return Function << (JSONString ^ "enumerate") << (ArgSeq << _(Expr));
5656
},
5757

58-
(In(UnifyExpr) / In(ArgSeq)) *
58+
In(UnifyExpr, ArgSeq) *
5959
(T(Membership)
6060
<< (T(Expr)[Idx] * T(Expr)[Item] * T(Expr)[ItemSeq])) >>
6161
[](Match& _) {
6262
return Function << (JSONString ^ "membership-tuple")
6363
<< (ArgSeq << _(Idx) << _(Item) << _(ItemSeq));
6464
},
6565

66-
(In(UnifyExpr) / In(ArgSeq)) *
66+
In(UnifyExpr, ArgSeq) *
6767
(T(Membership)
6868
<< (T(Undefined) * T(Expr)[Item] * T(Expr)[ItemSeq])) >>
6969
[](Match& _) {
7070
return Function << (JSONString ^ "membership-single")
7171
<< (ArgSeq << _(Item) << _(ItemSeq));
7272
},
7373

74-
(In(UnifyExpr) / In(ArgSeq)) * (T(Term) << T(Array)[Array]) >>
74+
In(UnifyExpr, ArgSeq) * (T(Term) << T(Array)[Array]) >>
7575
[](Match& _) {
7676
Node seq = NodeDef::create(Seq);
7777
Location temp = _.fresh({"array"});
@@ -85,7 +85,7 @@ namespace rego
8585
return seq;
8686
},
8787

88-
(In(UnifyExpr) / In(ArgSeq)) * (T(Term) << T(Set)[Set]) >>
88+
In(UnifyExpr, ArgSeq) * (T(Term) << T(Set)[Set]) >>
8989
[](Match& _) {
9090
Node seq = NodeDef::create(Seq);
9191
Location temp = _.fresh({"set"});
@@ -99,7 +99,7 @@ namespace rego
9999
return seq;
100100
},
101101

102-
(In(UnifyExpr) / In(ArgSeq)) *
102+
In(UnifyExpr, ArgSeq) *
103103
(T(ArrayCompr) / T(SetCompr) / T(ObjectCompr))[Compr] >>
104104
[](Match& _) {
105105
std::string name = _(Compr)->type().str();
@@ -112,7 +112,7 @@ namespace rego
112112
;
113113
},
114114

115-
(In(UnifyExpr) / In(ArgSeq)) *
115+
In(UnifyExpr, ArgSeq) *
116116
(T(Term) << (T(ArrayCompr) / T(SetCompr) / T(ObjectCompr)))[Compr] >>
117117
[](Match& _) {
118118
std::string name = _(Compr)->type().str();
@@ -125,12 +125,12 @@ namespace rego
125125
;
126126
},
127127

128-
(In(UnifyExpr) / In(ArgSeq)) * (T(Merge) << T(Var)[Var]) >>
128+
In(UnifyExpr, ArgSeq) * (T(Merge) << T(Var)[Var]) >>
129129
[](Match& _) {
130130
return Function << (JSONString ^ "merge") << (ArgSeq << _(Var));
131131
},
132132

133-
(In(UnifyExpr) / In(ArgSeq) * T(NumTerm)[NumTerm]) >>
133+
(In(UnifyExpr, ArgSeq) * T(NumTerm)[NumTerm]) >>
134134
[](Match& _) { return Scalar << _(NumTerm)->front(); },
135135

136136
In(ArgSeq) * T(Function)[Function]([](auto& n) {
@@ -148,45 +148,45 @@ namespace rego
148148
return seq;
149149
},
150150

151-
(In(UnifyExpr) / In(ArgSeq)) * (T(Not) << T(Expr)[Expr]) >>
151+
In(UnifyExpr, ArgSeq) * (T(Not) << T(Expr)[Expr]) >>
152152
[](Match& _) {
153153
return Function << (JSONString ^ "not") << (ArgSeq << _(Expr));
154154
},
155155

156-
(In(UnifyExpr) / In(ArgSeq)) * (T(UnaryExpr) << T(ArithArg)[ArithArg]) >>
156+
In(UnifyExpr, ArgSeq) * (T(UnaryExpr) << T(ArithArg)[ArithArg]) >>
157157
[](Match& _) {
158158
return Function << (JSONString ^ "unary")
159159
<< (ArgSeq << _(ArithArg)->front());
160160
},
161161

162-
(In(UnifyExpr) / In(ArgSeq)) *
162+
In(UnifyExpr, ArgSeq) *
163163
(T(ArithInfix) << (T(ArithArg)[Lhs] * Any[Op] * T(ArithArg)[Rhs])) >>
164164
[](Match& _) {
165165
return Function << (JSONString ^ "arithinfix")
166166
<< (ArgSeq << _(Op) << _(Lhs)->front()
167167
<< _(Rhs)->front());
168168
},
169169

170-
(In(UnifyExpr) / In(ArgSeq)) *
170+
In(UnifyExpr, ArgSeq) *
171171
(T(BinInfix) << (T(BinArg)[Lhs] * Any[Op] * T(BinArg)[Rhs])) >>
172172
[](Match& _) {
173173
return Function << (JSONString ^ "bininfix")
174174
<< (ArgSeq << _(Op) << _(Lhs)->front()
175175
<< _(Rhs)->front());
176176
},
177177

178-
(In(UnifyExpr) / In(ArgSeq)) *
178+
In(UnifyExpr, ArgSeq) *
179179
(T(BoolInfix) << (T(BoolArg)[Lhs] * Any[Op] * T(BoolArg)[Rhs])) >>
180180
[](Match& _) {
181181
return Function << (JSONString ^ "boolinfix")
182182
<< (ArgSeq << _(Op) << _(Lhs)->front()
183183
<< _(Rhs)->front());
184184
},
185185

186-
(In(UnifyExpr) / In(ArgSeq)) * (T(RefTerm) << T(Var)[Var]) >>
186+
In(UnifyExpr, ArgSeq) * (T(RefTerm) << T(Var)[Var]) >>
187187
[](Match& _) { return _(Var); },
188188

189-
(In(UnifyExpr) / In(ArgSeq)) *
189+
In(UnifyExpr, ArgSeq) *
190190
(T(RefTerm)
191191
<< (T(SimpleRef) << (T(Var)[Var] * (T(RefArgDot)[RefArgDot])))) >>
192192
[](Match& _) {
@@ -196,7 +196,7 @@ namespace rego
196196
<< (ArgSeq << _(Var) << arg);
197197
},
198198

199-
(In(UnifyExpr) / In(ArgSeq)) *
199+
In(UnifyExpr, ArgSeq) *
200200
(T(RefTerm)
201201
<< (T(SimpleRef)
202202
<< (T(Var)[Var] * (T(RefArgBrack)[RefArgBrack])))) >>
@@ -215,21 +215,20 @@ namespace rego
215215
}
216216
},
217217

218-
(In(UnifyExpr) / In(ArgSeq)) *
218+
In(UnifyExpr, ArgSeq) *
219219
(T(ExprCall) << (T(Var)[Var] * T(ArgSeq)[ArgSeq])) >>
220220
[](Match& _) {
221221
return Function << (JSONString ^ "call")
222222
<< (ArgSeq << _(Var) << *_[ArgSeq]);
223223
},
224224

225-
(In(Array) / In(Set) / In(ObjectItem)) * (T(Expr) << T(Term)[Term]) >>
225+
In(Array, Set, ObjectItem) * (T(Expr) << T(Term)[Term]) >>
226226
[](Match& _) { return _(Term); },
227227

228-
(In(Array) / In(Set) / In(ObjectItem)) *
229-
(T(Expr) << T(NumTerm)[NumTerm]) >>
228+
In(Array, Set, ObjectItem) * (T(Expr) << T(NumTerm)[NumTerm]) >>
230229
[](Match& _) { return Term << (Scalar << *_[NumTerm]); },
231230

232-
(In(RuleComp) / In(RuleFunc) / In(RuleObj) / In(RuleSet) / In(DataItem)) *
231+
In(RuleComp, RuleFunc, RuleObj, RuleSet, DataItem) *
233232
T(DataTerm)[DataTerm] >>
234233
[](Match& _) { return Term << *_[DataTerm]; },
235234

@@ -245,7 +244,7 @@ namespace rego
245244
In(Object) * T(DataObjectItem)[DataObjectItem] >>
246245
[](Match& _) { return ObjectItem << *_[DataObjectItem]; },
247246

248-
(In(ObjectItem) / In(Array) / In(Set)) * T(DataTerm)[DataTerm] >>
247+
In(ObjectItem, Array, Set) * T(DataTerm)[DataTerm] >>
249248
[](Match& _) { return Term << *_[DataTerm]; },
250249

251250
// errors
@@ -256,7 +255,7 @@ namespace rego
256255
In(Expr) * Any[Expr] >>
257256
[](Match& _) { return err(_(Expr), "Invalid expression"); },
258257

259-
(In(UnifyExpr) / In(ArgSeq)) * (T(RefTerm) << T(Ref)[Ref]) >>
258+
In(UnifyExpr, ArgSeq) * (T(RefTerm) << T(Ref)[Ref]) >>
260259
[](Match& _) { return err(_(Ref), "Invalid reference"); },
261260

262261
In(Array) * T(Expr)[Expr] >>

src/passes/lists.cc

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ namespace rego
171171
In(Group) * (T(Square) << (T(List)[List] * End)) >>
172172
[](Match& _) { return Array << *_[List]; },
173173

174-
(In(Group) / In(ImportRef)) * (T(Square) << T(Group)[Group]) >>
174+
In(Group, ImportRef) * (T(Square) << T(Group)[Group]) >>
175175
[](Match& _) { return Array << _(Group); },
176176

177177
T(List)
@@ -372,10 +372,10 @@ namespace rego
372372
return err(_(Rhs), "Invalid second node in some declaration");
373373
},
374374

375-
(In(ObjectItemSeq) / In(Object)) * T(Group)[Group] >>
375+
In(ObjectItemSeq, Object) * T(Group)[Group] >>
376376
[](Match& _) { return err(_(Group), "Invalid object key/value"); },
377377

378-
(In(Array) / In(Set) / In(List)) * T(ObjectItem)[ObjectItem] >>
378+
In(Array, Set, List) * T(ObjectItem)[ObjectItem] >>
379379
[](Match& _) { return err(_(ObjectItem), "Invalid item"); },
380380

381381
In(Group) * T(Group)[Group] >>
@@ -398,8 +398,7 @@ namespace rego
398398
})) >>
399399
[](Match& _) { return err(_(EverySeq), "Missing body of every"); },
400400

401-
(In(ArrayCompr) / In(SetCompr) / In(ObjectCompr)) *
402-
(T(Group)[Group] << End) >>
401+
In(ArrayCompr, SetCompr, ObjectCompr) * (T(Group)[Group] << End) >>
403402
[](Match& _) { return err(_(Group), "Invalid comprehension"); },
404403

405404
In(UnifyBody) * T(ObjectItem)[ObjectItem] >>

src/passes/merge_data.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ namespace rego
5353
In(DataTerm) * T(Object)[Object] >>
5454
[](Match& _) { return DataObject << *_[Object]; },
5555

56-
(In(DataArray) / In(DataSet)) * (T(Expr) << T(Term)[Term]) >>
56+
In(DataArray, DataSet) * (T(Expr) << T(Term)[Term]) >>
5757
[](Match& _) { return DataTerm << _(Term)->front(); },
5858

5959
In(Rego) * (T(DataSeq) << (T(DataModule)[DataModule] * End)) >>
@@ -91,7 +91,7 @@ namespace rego
9191
return err(_(Compr), "Syntax error: unexpected comprehension");
9292
},
9393

94-
(In(DataArray) / In(DataSet)) * T(Expr)[Expr] >>
94+
In(DataArray, DataSet) * T(Expr)[Expr] >>
9595
[](Match& _) {
9696
return err(_(Expr), "Syntax error: unexpected expression");
9797
},

src/passes/modules.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ namespace rego
2828
<< (Policy << _[Policy]);
2929
},
3030

31-
(In(List) / In(Compr)) *
31+
In(List, Compr) *
3232
(T(Group) << (KeyToken++[Key] * T(Colon) * Any++[Val])) >>
3333
[](Match& _) {
3434
return ObjectItem << (Group << _[Key]) << (Group << _[Val]);
@@ -111,7 +111,7 @@ namespace rego
111111
In(Group) * (T(Import)[Import] << End) >>
112112
[](Match& _) { return err(_(Import), "Invalid import"); },
113113

114-
(In(Import) / In(Package)) * (T(Group)[Group] << End) >>
114+
In(Import, Package) * (T(Group)[Group] << End) >>
115115
[](Match& _) { return err(_(Group), "Invalid import"); },
116116
};
117117
}

src/passes/rulebody.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -663,7 +663,7 @@ namespace rego
663663
return err(_(BoolInfix), "Invalid boolean expression");
664664
},
665665

666-
(In(Term) / In(BinArg)) * T(SetCompr)[SetCompr] >>
666+
In(Term, BinArg) * T(SetCompr)[SetCompr] >>
667667
[](Match& _) {
668668
return err(_(SetCompr), "Invalid set comprehension");
669669
},

src/passes/skip_refs.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ namespace rego
120120
SkipSet skips = std::make_shared<std::set<std::string>>();
121121

122122
PassDef skip_refs = {
123-
(In(RuleRef) / In(RefTerm)) * T(Ref)[Ref]([skips](auto& n) {
123+
In(RuleRef, RefTerm) * T(Ref)[Ref]([skips](auto& n) {
124124
return skip_prefix_ref(skips, *n.first).length > 0;
125125
}) >>
126126
[skips](Match& _) {

0 commit comments

Comments
 (0)