diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/tools/wasm2js.cpp | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/src/tools/wasm2js.cpp b/src/tools/wasm2js.cpp index 2007a65d8..ebed16226 100644 --- a/src/tools/wasm2js.cpp +++ b/src/tools/wasm2js.cpp @@ -353,11 +353,13 @@ static void optimizeJS(Ref ast) { } else if (isUnary(node, L_NOT)) { node[2] = optimizeBoolean(node[2]); } - // Add/subtract can merge coercions up. + // Add/subtract can merge coercions up, except when a child is a division, + // which needs to be eagerly truncated to remove fractional results. else if (isBinary(node, PLUS) || isBinary(node, MINUS)) { auto left = node[2]; auto right = node[3]; - if (isOrZero(left) && isOrZero(right)) { + if (isOrZero(left) && isOrZero(right) && !isBinary(left[2], DIV) && + !isBinary(right[2], DIV)) { auto op = node[1]->getIString(); // Add a coercion on top. node[1]->setString(OR); |