diff options
-rw-r--r-- | tests/runner.py | 2 | ||||
-rw-r--r-- | tools/js-optimizer.js | 11 | ||||
-rw-r--r-- | tools/test-js-optimizer-t2c-output.js | 9 | ||||
-rw-r--r-- | tools/test-js-optimizer-t2c.js | 9 |
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"] |