aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tools/js-optimizer.js3
-rw-r--r--tools/test-js-optimizer-t2-output.js3
-rw-r--r--tools/test-js-optimizer-t2.js3
3 files changed, 8 insertions, 1 deletions
diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js
index 7bb0b403..435a64de 100644
--- a/tools/js-optimizer.js
+++ b/tools/js-optimizer.js
@@ -497,7 +497,8 @@ function optimizeShifts(ast) {
more = false;
traverse(fun, function(node, type) {
if (node[0] == 'binary' && node[1] in SIMPLE_SHIFTS && node[2][0] == 'binary' && node[2][1] in SIMPLE_SHIFTS &&
- node[3][0] == 'num' && node[2][3][0] == 'num') { // do not turn a << b << c into a << b + c; while logically identical, it is slower
+ node[3][0] == 'num' && node[2][3][0] == 'num' && // do not turn a << b << c into a << b + c; while logically identical, it is slower
+ Math.abs(node[3][1]) < 8 && Math.abs(node[2][3][1]) < 8) { // do not modify things like x << 24 >> 24 (which removes some bits)
more = true;
var combinedShift = '>>';
var sign1 = node[1] == '>>' ? 1 : -1;
diff --git a/tools/test-js-optimizer-t2-output.js b/tools/test-js-optimizer-t2-output.js
index 898d6633..bc47c9bb 100644
--- a/tools/test-js-optimizer-t2-output.js
+++ b/tools/test-js-optimizer-t2-output.js
@@ -70,5 +70,8 @@ function shifty($id) {
HEAP32[$tp] = 5;
HEAP32[HEAP[$tp]] = 5;
HEAP32[HEAP[$tp] >> 2] = 5;
+ pause(7);
+ q(go());
+ q(go() >> 8 << 8);
}
// EMSCRIPTEN_GENERATED_FUNCTIONS: ["shifty"]
diff --git a/tools/test-js-optimizer-t2.js b/tools/test-js-optimizer-t2.js
index 3afdbc3d..f9b5e10c 100644
--- a/tools/test-js-optimizer-t2.js
+++ b/tools/test-js-optimizer-t2.js
@@ -78,5 +78,8 @@ function shifty($id) {
HEAP32[$tp >> 2] = 5;
HEAP32[HEAP[$tp >> 2]] = 5;
HEAP32[HEAP[$tp >> 2] >> 2] = 5;
+ pause(7);
+ q(go() >> 1 << 1);
+ q(go() >> 8 << 8);
}
// EMSCRIPTEN_GENERATED_FUNCTIONS: ["shifty"]