diff --git a/src/eval/optimizer.cpp b/src/eval/optimizer.cpp index 8795782d..2727b560 100644 --- a/src/eval/optimizer.cpp +++ b/src/eval/optimizer.cpp @@ -666,11 +666,9 @@ bool Optimizer::fixSandwich(Program &p) const { std::swap(op1, op2); op1.source.value *= op2.source.value; changed = true; - } else if (op1.type == Operation::Type::MUL && - Semantics::mod(op2.source.value, op1.source.value) == - Number::ZERO) { - std::swap(op1, op2); - op1.source.value /= op2.source.value; + } else if (op1.type == Operation::Type::MUL) { + std::swap(op3, op2); + op3.source.value *= op2.source.value; changed = true; } } else if (ProgramUtil::isAdditive(op2.type) && diff --git a/tests/optimizer/E031.asm b/tests/optimizer/E031.asm index 32345987..f6cc778d 100644 --- a/tests/optimizer/E031.asm +++ b/tests/optimizer/E031.asm @@ -3,5 +3,5 @@ mul $0,6 sub $0,12 mul $0,3 ; out -sub $0,2 mul $0,18 +sub $0,36 diff --git a/tests/optimizer/E082.asm b/tests/optimizer/E082.asm new file mode 100644 index 00000000..7a9ee561 --- /dev/null +++ b/tests/optimizer/E082.asm @@ -0,0 +1,7 @@ +; in +mul $0,2 +add $0,1 +mul $0,4 +; out +mul $0,8 +add $0,4