diff options
author | Dan Gohman <sunfish@google.com> | 2013-12-19 15:28:27 -0800 |
---|---|---|
committer | Dan Gohman <sunfish@google.com> | 2013-12-19 15:28:27 -0800 |
commit | 47e803a62598194891eae3aaef50f551f5fdc4bb (patch) | |
tree | 410eddbdd187e299057315d21140be19d3c0c77d /tools/js-optimizer.js | |
parent | 970cd15cd79a538b2dc404a16bfa2745915f6b17 (diff) |
Optimize away masks on stores to HEAP8 and HEAP16.
Optimize HEAP8[i] = x & 255 to HEAP8[i] = x, and similar for HEAP16.
Diffstat (limited to 'tools/js-optimizer.js')
-rw-r--r-- | tools/js-optimizer.js | 24 |
1 files changed, 18 insertions, 6 deletions
diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 57ce0071..57585663 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -585,12 +585,24 @@ function simplifyExpressions(ast) { } } else if (type === 'assign') { // optimizations for assigning into HEAP32 specifically - if (node[1] === true && node[2][0] === 'sub' && node[2][1][0] === 'name' && node[2][1][1] === 'HEAP32') { - // HEAP32[..] = x | 0 does not need the | 0 (unless it is a mandatory |0 of a call) - if (node[3][0] === 'binary' && node[3][1] === '|') { - if (node[3][2][0] === 'num' && node[3][2][1] === 0 && node[3][3][0] != 'call') { - node[3] = node[3][3]; - } else if (node[3][3][0] === 'num' && node[3][3][1] === 0 && node[3][2][0] != 'call') { + if (node[1] === true && node[2][0] === 'sub' && node[2][1][0] === 'name') { + if (node[2][1][1] === 'HEAP32') { + // HEAP32[..] = x | 0 does not need the | 0 (unless it is a mandatory |0 of a call) + if (node[3][0] === 'binary' && node[3][1] === '|') { + if (node[3][2][0] === 'num' && node[3][2][1] === 0 && node[3][3][0] != 'call') { + node[3] = node[3][3]; + } else if (node[3][3][0] === 'num' && node[3][3][1] === 0 && node[3][2][0] != 'call') { + node[3] = node[3][2]; + } + } + } else if (node[2][1][1] === 'HEAP8') { + // HEAP8[..] = x & 0xff does not need the & 0xff + if (node[3][0] === 'binary' && node[3][1] === '&' && node[3][3][0] == 'num' && node[3][3][1] == 0xff) { + node[3] = node[3][2]; + } + } else if (node[2][1][1] === 'HEAP16') { + // HEAP16[..] = x & 0xffff does not need the & 0xffff + if (node[3][0] === 'binary' && node[3][1] === '&' && node[3][3][0] == 'num' && node[3][3][1] == 0xffff) { node[3] = node[3][2]; } } |