aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tests/runner.py2
-rw-r--r--tools/js-optimizer.js11
-rw-r--r--tools/test-js-optimizer-t2c-output.js9
-rw-r--r--tools/test-js-optimizer-t2c.js9
4 files changed, 26 insertions, 5 deletions
diff --git a/tests/runner.py b/tests/runner.py
index c35f0121..934b05cc 100644
--- a/tests/runner.py
+++ b/tests/runner.py
@@ -5315,6 +5315,8 @@ Options that are modified or new in %s include:
for input, expected, passes in [
(open(path_from_root('tools', 'test-js-optimizer.js')).read(), open(path_from_root('tools', 'test-js-optimizer-output.js')).read(),
['hoistMultiples', 'loopOptimizer', 'unGlobalize', 'removeAssignsToUndefined', 'simplifyExpressionsPre', 'simplifyExpressionsPost']),
+ (open(path_from_root('tools', 'test-js-optimizer-t2c.js')).read(), open(path_from_root('tools', 'test-js-optimizer-t2c-output.js')).read(),
+ ['simplifyExpressionsPre', 'optimizeShiftsConservative']),
#(open(path_from_root('tools', 'test-js-optimizer-t2.js')).read(), open(path_from_root('tools', 'test-js-optimizer-t2-output.js')).read(),
# ['simplifyExpressionsPre', 'optimizeShiftsAggressive']),
]:
diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js
index 81512ed4..a7381fd9 100644
--- a/tools/js-optimizer.js
+++ b/tools/js-optimizer.js
@@ -356,6 +356,7 @@ function simplifyExpressionsPre(ast) {
// to greatly reduce the number of shift operations.
// TODO: when shifting a variable, if there are other uses, keep an unshifted version too, to prevent slowdowns?
function optimizeShiftsInternal(ast, conservative) {
+ var MAX_SHIFTS = 3;
traverseGeneratedFunctions(ast, function(fun) {
var funMore = true;
var funFinished = {};
@@ -405,7 +406,7 @@ function optimizeShiftsInternal(ast, conservative) {
traverse(fun, function(node, type) {
if (type == 'binary' && node[1] == '>>' && node[3][0] == 'num') {
var shifts = node[3][1];
- if (shifts >= 0 && shifts <= 3) {
+ if (shifts <= MAX_SHIFTS) {
// Push the >> inside the value elements
function addShift(subNode) {
if (subNode[0] == 'binary' && subNode[1] == '+') {
@@ -559,7 +560,7 @@ function optimizeShiftsInternal(ast, conservative) {
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
- 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)
+ Math.abs(node[3][1]) <= MAX_SHIFTS && Math.abs(node[2][3][1]) <= MAX_SHIFTS) { // do not modify things like x << 24 >> 24 (which is reSign)
more = true;
var combinedShift = '>>';
var sign1 = node[1] == '>>' ? 1 : -1;
@@ -590,7 +591,7 @@ function optimizeShiftsInternal(ast, conservative) {
});
// Before recombining, do some additional optimizations
traverse(fun, function(node, type) {
- if (type == 'binary' && node[1] == '>>' && node[2][0] == 'num' && node[3][0] == 'num') {
+ if (type == 'binary' && node[1] == '>>' && node[2][0] == 'num' && node[3][0] == 'num' && node[3][0] <= MAX_SHIFTS) {
var subNode = node[2];
var shifts = node[3][1];
var result = subNode[1] / Math.pow(2, shifts);
@@ -646,7 +647,7 @@ function optimizeShiftsInternal(ast, conservative) {
return -originalOrder.indexOf(item);
}
if (node[0] == 'binary' && node[1] in SIMPLE_SHIFTS) {
- if (node[3][0] == 'num' && node[3][1] >= 0 && node[3][1] <= 3) return 2*node[3][1] + (node[1] == '>>' ? 100 : 0); // 0-106
+ if (node[3][0] == 'num' && node[3][1] <= MAX_SHIFTS) return 2*node[3][1] + (node[1] == '>>' ? 100 : 0); // 0-106
return (node[1] == '>>' ? 20000 : 10000) + originalOrderKey(node);
}
if (node[0] == 'num') return -20000 + node[1];
@@ -683,7 +684,7 @@ function optimizeShiftsInternal(ast, conservative) {
// so it might take more space, but normally at most one more digit).
var added = false;
for (i = 0; i < addedItems.length; i++) {
- if (addedItems[i][0] == 'binary' && addedItems[i][1] == '>>' && addedItems[i][3][0] == 'num') {
+ if (addedItems[i][0] == 'binary' && addedItems[i][1] == '>>' && addedItems[i][3][0] == 'num' && addedItems[i][3][0] <= MAX_SHIFTS) {
addedItems[i] = ['binary', '>>', ['binary', '+', addedItems[i][2], ['num', num << addedItems[i][3][1]]], addedItems[i][3]];
added = true;
}
diff --git a/tools/test-js-optimizer-t2c-output.js b/tools/test-js-optimizer-t2c-output.js
new file mode 100644
index 00000000..d8db7e43
--- /dev/null
+++ b/tools/test-js-optimizer-t2c-output.js
@@ -0,0 +1,9 @@
+function shifty() {
+ $pPage = HEAP32[($26 << 16 >> 16) + ($pCur_addr + 116 >> 2)];
+ var $ead_192394 = HEAP32[($26 << 16 >> 16) + ($pCur_addr + 116 >> 2)];
+ $pPage2 = HEAP32[($26 << 16 >> 16 << 2) + $pCur_addr + 116];
+ var $ead_192394b = HEAP32[($26 << 16 >> 16 << 2) + $pCur_addr + 116];
+ $pPage2 = HEAP32[($26 << 16 >> 16) + $pCur_addr + 116];
+ var $ead_192394b = HEAP32[($26 << 16 >> 16) + $pCur_addr + 116];
+}
+// EMSCRIPTEN_GENERATED_FUNCTIONS: ["shifty"]
diff --git a/tools/test-js-optimizer-t2c.js b/tools/test-js-optimizer-t2c.js
new file mode 100644
index 00000000..7b82777b
--- /dev/null
+++ b/tools/test-js-optimizer-t2c.js
@@ -0,0 +1,9 @@
+function shifty() {
+ $pPage = HEAP32[$pCur_addr + 116 + ($26 << 16 >> 16 << 2) >> 2];
+ var $ead_192394 = HEAP32[$pCur_addr + 116 + ($26 << 16 >> 16 << 2) >> 2];
+ $pPage2 = HEAP32[$pCur_addr + 116 + ($26 << 16 >> 16 << 2)];
+ var $ead_192394b = HEAP32[$pCur_addr + 116 + ($26 << 16 >> 16 << 2)];
+ $pPage2 = HEAP32[$pCur_addr + 116 + ($26 << 16 >> 16)];
+ var $ead_192394b = HEAP32[$pCur_addr + 116 + ($26 << 16 >> 16)];
+}
+// EMSCRIPTEN_GENERATED_FUNCTIONS: ["shifty"]