Skip to content

Commit fef1a99

Browse files
committed
improve optimizer
1 parent 1c20579 commit fef1a99

File tree

6 files changed

+36
-10
lines changed

6 files changed

+36
-10
lines changed

CHANGELOG.md

+3
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,13 @@ To install or update LODA, please follow the [installation instructions](https:/
22

33
## [Unreleased]
44

5+
## v25.1.8
6+
57
### Enhancements
68

79
* Rename digit operations
810
* Improve offset handling
11+
* Improve optimizer
912

1013
## v25.1.3
1114

src/cmd/test.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ void Test::slow() {
7676
randomNumber(100);
7777
ackermann();
7878
stats();
79-
// apiClient(); // requires API server
79+
apiClient(); // requires API server
8080
oeisList();
8181
oeisSeq();
8282
iterator(100);

src/eval/optimizer.cpp

+14-9
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ bool Optimizer::removeEmptyLoops(Program &p) const {
111111
}
112112

113113
bool 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

253258
std::pair<int64_t, int64_t> findRepeatedOps(const Program &p,

tests/optimizer/E050.asm

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
; in
2+
pow $0,6
3+
nrt $0,4
4+
; out
5+
pow $0,3
6+
nrt $0,2

tests/optimizer/E051.asm

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
; in
2+
pow $0,8
3+
nrt $0,8
4+
add $0,1
5+
; out
6+
add $0,1

tests/optimizer/E052.asm

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
; in
2+
pow $0,7
3+
nrt $0,6
4+
; out
5+
pow $0,7
6+
nrt $0,6

0 commit comments

Comments
 (0)