diff options
author | Alon Zakai <alonzakai@gmail.com> | 2013-06-08 09:47:48 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2013-06-08 09:55:49 -0700 |
commit | 9ea131b762d124ff8e40898de211025f42589164 (patch) | |
tree | 17e61cf998a80d41e7be7509b03665d9d5488145 /tools/js-optimizer.js | |
parent | 430cfefc1612c00c481e5343b3be4ddc514fd415 (diff) |
remove unneeded outside |0 when a sequence ends in a safe bitop
Diffstat (limited to 'tools/js-optimizer.js')
-rw-r--r-- | tools/js-optimizer.js | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index c598fb81..57a3b1b3 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -402,6 +402,8 @@ function removeUnneededLabelSettings(ast) { // Various expression simplifications. Pre run before closure (where we still have metadata), Post run after. +var USEFUL_BINARY_OPS = set('<<', '>>', '|', '&', '^'); + function simplifyExpressionsPre(ast) { // Look for (x&A)<<B>>B and replace it with X&A if possible. function simplifySignExtends(ast) { @@ -427,7 +429,6 @@ function simplifyExpressionsPre(ast) { // 'useful' mathops already |0 anyhow. function simplifyBitops(ast) { - var USEFUL_BINARY_OPS = set('<<', '>>', '|', '&', '^'); var SAFE_BINARY_OPS = set('+', '-', '*'); // division is unsafe as it creates non-ints in JS; mod is unsafe as signs matter so we can't remove |0's var ZERO = ['num', 0]; var rerun = true; @@ -538,6 +539,17 @@ function simplifyExpressionsPre(ast) { } } } + } else if (type == 'binary' && node[1] == '|') { + // canonicalize order of |0 to end + if (node[2][0] == 'num' && node[2][1] == 0) { + var temp = node[2]; + node[2] = node[3]; + node[3] = temp; + } + // if a seq ends in an |0, remove an external |0 + if (node[2][0] == 'seq' && node[2][2][0] == 'binary' && node[2][2][1] in USEFUL_BINARY_OPS) { + return node[2]; + } } }); |