diff --git a/CHANGELOG.md b/CHANGELOG.md index be64becd..3523d6e0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,10 +2,13 @@ To install or update LODA, please follow the [installation instructions](https:/ ## [Unreleased] +## v25.1.8 + ### Enhancements * Rename digit operations * Improve offset handling +* Improve optimizer ## v25.1.3 diff --git a/src/cmd/test.cpp b/src/cmd/test.cpp index d2cbde1f..fe1ce95f 100644 --- a/src/cmd/test.cpp +++ b/src/cmd/test.cpp @@ -76,7 +76,7 @@ void Test::slow() { randomNumber(100); ackermann(); stats(); - // apiClient(); // requires API server + apiClient(); // requires API server oeisList(); oeisSeq(); iterator(100); diff --git a/src/eval/optimizer.cpp b/src/eval/optimizer.cpp index f3b7034d..a5b84c5d 100644 --- a/src/eval/optimizer.cpp +++ b/src/eval/optimizer.cpp @@ -111,7 +111,7 @@ bool Optimizer::removeEmptyLoops(Program &p) const { } bool Optimizer::mergeOps(Program &p) const { - bool merged = false; + bool updated = false; for (size_t i = 0; i + 1 < p.ops.size(); i++) { bool do_merge = false; @@ -161,17 +161,22 @@ bool Optimizer::mergeOps(Program &p) const { do_merge = true; } - // first mul, second div? - else if (o1.type == Operation::Type::MUL && - o2.type == Operation::Type::DIV && - o1.source.value != Number::ZERO && - o2.source.value != Number::ZERO) { + // first mul(pow), second div(nrt)? + else if ((o1.type == Operation::Type::MUL && + o2.type == Operation::Type::DIV && + o1.source.value != Number::ZERO && + o2.source.value != Number::ZERO) || + (o1.type == Operation::Type::POW && + o2.type == Operation::Type::NRT && + o1.source.value > Number::ONE && + o2.source.value > Number::ONE)) { auto gcd = Semantics::gcd(o1.source.value, o2.source.value); o1.source.value = Semantics::div(o1.source.value, gcd); if (gcd == o2.source.value) { do_merge = true; - } else { + } else if (gcd != Number::ONE) { o2.source.value = Semantics::div(o2.source.value, gcd); + updated = true; } } @@ -243,11 +248,11 @@ bool Optimizer::mergeOps(Program &p) const { } p.ops.erase(p.ops.begin() + i + 1, p.ops.begin() + i + 2); --i; - merged = true; + updated = true; } } - return merged; + return updated; } std::pair findRepeatedOps(const Program &p, diff --git a/tests/optimizer/E050.asm b/tests/optimizer/E050.asm new file mode 100644 index 00000000..06506ef7 --- /dev/null +++ b/tests/optimizer/E050.asm @@ -0,0 +1,6 @@ +; in +pow $0,6 +nrt $0,4 +; out +pow $0,3 +nrt $0,2 diff --git a/tests/optimizer/E051.asm b/tests/optimizer/E051.asm new file mode 100644 index 00000000..1e245e85 --- /dev/null +++ b/tests/optimizer/E051.asm @@ -0,0 +1,6 @@ +; in +pow $0,8 +nrt $0,8 +add $0,1 +; out +add $0,1 diff --git a/tests/optimizer/E052.asm b/tests/optimizer/E052.asm new file mode 100644 index 00000000..f86008c1 --- /dev/null +++ b/tests/optimizer/E052.asm @@ -0,0 +1,6 @@ +; in +pow $0,7 +nrt $0,6 +; out +pow $0,7 +nrt $0,6