diff options
author | Alon Zakai <alonzakai@gmail.com> | 2013-07-08 17:02:03 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2013-07-08 17:02:03 -0700 |
commit | 208893daffc8aab7a1a8e75fbd10cd5144b569c4 (patch) | |
tree | 3b522602df814c58273d2c3859cf9974a31af880 /tools/js-optimizer.js | |
parent | 24471090e1c6b6066b188960507ec1c7d988d705 (diff) | |
parent | 30d6e3ce7d7b28998264b913b793a921d6d78e41 (diff) |
Merge pull request #1355 from sunfishcode/incoming
Incoming
Diffstat (limited to 'tools/js-optimizer.js')
-rw-r--r-- | tools/js-optimizer.js | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 39d58478..bc13354b 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -405,7 +405,7 @@ function removeUnneededLabelSettings(ast) { // Various expression simplifications. Pre run before closure (where we still have metadata), Post run after. var USEFUL_BINARY_OPS = set('<<', '>>', '|', '&', '^'); -var COMPARE_OPS = set('<', '<=', '>', '>=', '==', '===', '!='); +var COMPARE_OPS = set('<', '<=', '>', '>=', '==', '===', '!=', '!=='); function simplifyExpressionsPre(ast) { // Simplify common expressions used to perform integer conversion operations @@ -504,6 +504,8 @@ function simplifyExpressionsPre(ast) { stack.push(1); } else if ((type === 'binary' && node[1] in SAFE_BINARY_OPS) || type === 'num' || type === 'name') { stack.push(0); // This node is safe in that it does not interfere with this optimization + } else if (type === 'unary-prefix' && node[1] === '~') { + stack.push(1); } else { stack.push(-1); // This node is dangerous! Give up if you see this before you see '1' } @@ -554,6 +556,12 @@ function simplifyExpressionsPre(ast) { } } } + } else if (type === 'binary' && node[1] === '^') { + // LLVM represents bitwise not as xor with -1. Translate it back to an actual bitwise not. + if (node[3][0] === 'unary-prefix' && node[3][1] === '-' && node[3][2][0] === 'num' && + node[3][2][1] === 1) { + return ['unary-prefix', '~', node[2]]; + } } else if (type === 'binary' && node[1] === '>>' && node[3][0] === 'num' && node[2][0] === 'binary' && node[2][1] === '<<' && node[2][3][0] === 'num' && node[2][2][0] === 'sub' && node[2][2][1][0] === 'name') { |