@@ -111,7 +111,7 @@ bool Optimizer::removeEmptyLoops(Program &p) const {
111111}
112112
113113bool Optimizer::mergeOps (Program &p) const {
114- bool merged = false ;
114+ bool updated = false ;
115115 for (size_t i = 0 ; i + 1 < p.ops .size (); i++) {
116116 bool do_merge = false ;
117117
@@ -161,17 +161,22 @@ bool Optimizer::mergeOps(Program &p) const {
161161 do_merge = true ;
162162 }
163163
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)) {
169173 auto gcd = Semantics::gcd (o1.source .value , o2.source .value );
170174 o1.source .value = Semantics::div (o1.source .value , gcd);
171175 if (gcd == o2.source .value ) {
172176 do_merge = true ;
173- } else {
177+ } else if (gcd != Number::ONE) {
174178 o2.source .value = Semantics::div (o2.source .value , gcd);
179+ updated = true ;
175180 }
176181 }
177182
@@ -243,11 +248,11 @@ bool Optimizer::mergeOps(Program &p) const {
243248 }
244249 p.ops .erase (p.ops .begin () + i + 1 , p.ops .begin () + i + 2 );
245250 --i;
246- merged = true ;
251+ updated = true ;
247252 }
248253 }
249254
250- return merged ;
255+ return updated ;
251256}
252257
253258std::pair<int64_t , int64_t > findRepeatedOps (const Program &p,
0 commit comments