Skip to content

Commit

Permalink
improve optimizer
Browse files Browse the repository at this point in the history
  • Loading branch information
ckrause committed Jan 8, 2025
1 parent 1c20579 commit fef1a99
Show file tree
Hide file tree
Showing 6 changed files with 36 additions and 10 deletions.
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
2 changes: 1 addition & 1 deletion src/cmd/test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ void Test::slow() {
randomNumber(100);
ackermann();
stats();
// apiClient(); // requires API server
apiClient(); // requires API server
oeisList();
oeisSeq();
iterator(100);
Expand Down
23 changes: 14 additions & 9 deletions src/eval/optimizer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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;
}
}

Expand Down Expand Up @@ -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<int64_t, int64_t> findRepeatedOps(const Program &p,
Expand Down
6 changes: 6 additions & 0 deletions tests/optimizer/E050.asm
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
; in
pow $0,6
nrt $0,4
; out
pow $0,3
nrt $0,2
6 changes: 6 additions & 0 deletions tests/optimizer/E051.asm
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
; in
pow $0,8
nrt $0,8
add $0,1
; out
add $0,1
6 changes: 6 additions & 0 deletions tests/optimizer/E052.asm
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
; in
pow $0,7
nrt $0,6
; out
pow $0,7
nrt $0,6

0 comments on commit fef1a99

Please sign in to comment.