@@ -111,7 +111,7 @@ bool Optimizer::removeEmptyLoops(Program &p) const {
111
111
}
112
112
113
113
bool Optimizer::mergeOps (Program &p) const {
114
- bool merged = false ;
114
+ bool updated = false ;
115
115
for (size_t i = 0 ; i + 1 < p.ops .size (); i++) {
116
116
bool do_merge = false ;
117
117
@@ -161,17 +161,22 @@ bool Optimizer::mergeOps(Program &p) const {
161
161
do_merge = true ;
162
162
}
163
163
164
- // first mul, second div?
165
- else if (o1.type == Operation::Type::MUL &&
166
- o2.type == Operation::Type::DIV &&
167
- o1.source .value != Number::ZERO &&
168
- o2.source .value != Number::ZERO) {
164
+ // first mul(pow), second div(nrt)?
165
+ else if ((o1.type == Operation::Type::MUL &&
166
+ o2.type == Operation::Type::DIV &&
167
+ o1.source .value != Number::ZERO &&
168
+ o2.source .value != Number::ZERO) ||
169
+ (o1.type == Operation::Type::POW &&
170
+ o2.type == Operation::Type::NRT &&
171
+ o1.source .value > Number::ONE &&
172
+ o2.source .value > Number::ONE)) {
169
173
auto gcd = Semantics::gcd (o1.source .value , o2.source .value );
170
174
o1.source .value = Semantics::div (o1.source .value , gcd);
171
175
if (gcd == o2.source .value ) {
172
176
do_merge = true ;
173
- } else {
177
+ } else if (gcd != Number::ONE) {
174
178
o2.source .value = Semantics::div (o2.source .value , gcd);
179
+ updated = true ;
175
180
}
176
181
}
177
182
@@ -243,11 +248,11 @@ bool Optimizer::mergeOps(Program &p) const {
243
248
}
244
249
p.ops .erase (p.ops .begin () + i + 1 , p.ops .begin () + i + 2 );
245
250
--i;
246
- merged = true ;
251
+ updated = true ;
247
252
}
248
253
}
249
254
250
- return merged ;
255
+ return updated ;
251
256
}
252
257
253
258
std::pair<int64_t , int64_t > findRepeatedOps (const Program &p,
0 commit comments