diff options
author | Alon Zakai <alonzakai@gmail.com> | 2013-06-07 20:57:55 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2013-06-07 20:57:55 -0700 |
commit | 0f382355e385e94f933f9962bf8b7703614b7c16 (patch) | |
tree | 3fd3884a952e87e2fbdbf2b48629b9c56a6fa2e9 | |
parent | 8c3c8879d0a6c70fce10ee645e0f871f44f3d45a (diff) |
improve tempDoublePtr elimination and only run analysis when necessary
-rw-r--r-- | tools/js-optimizer.js | 65 | ||||
-rw-r--r-- | tools/test-js-optimizer-asm-pre-output.js | 2 | ||||
-rw-r--r-- | tools/test-js-optimizer-asm-pre.js | 2 |
3 files changed, 43 insertions, 26 deletions
diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 7aff3a47..ee056c33 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -479,8 +479,12 @@ function simplifyExpressionsPre(ast) { return true; } + var hasTempDoublePtr = false; + traverseGenerated(ast, function(node, type) { - if (type == 'binary' && node[1] == '&' && node[3][0] == 'num') { + if (type == 'name') { + if (node[1] == 'tempDoublePtr') hasTempDoublePtr = true; + } else if (type == 'binary' && node[1] == '&' && node[3][0] == 'num') { if (node[2][0] == 'num') return ['num', node[2][1] & node[3][1]]; var input = node[2]; var amount = node[3][1]; @@ -533,36 +537,45 @@ function simplifyExpressionsPre(ast) { node[3] = node[3][2]; } } - // remove bitcasts that are now obviously pointless, e.g. - // HEAP32[$45 >> 2] = HEAPF32[tempDoublePtr >> 2] = ($14 < $28 ? $14 : $28) - $42, HEAP32[tempDoublePtr >> 2] | 0; - var value = node[3]; - if (value[0] == 'seq' && value[1][0] == 'assign' && value[1][2][0] == 'sub' && value[1][2][1][0] == 'name' && value[1][2][1][1] == 'HEAPF32' && - value[1][2][2][0] == 'binary' && value[1][2][2][2][0] == 'name' && value[1][2][2][2][1] == 'tempDoublePtr') { - // transform to HEAPF32[$45 >> 2] = ($14 < $28 ? $14 : $28) - $42; - node[2][1][1] = 'HEAPF32'; - node[3] = value[1][3]; - } - } - } else if (type == 'seq') { - // (HEAP32[tempDoublePtr >> 2] = HEAP32[$37 >> 2], +HEAPF32[tempDoublePtr >> 2]) - // ==> - // +HEAPF32[$37 >> 2] - if (node[0] == 'seq' && node[1][0] == 'assign' && node[1][2][0] == 'sub' && node[1][2][1][0] == 'name' && - (node[1][2][1][1] == 'HEAP32' || node[1][2][1][1] == 'HEAPF32') && - node[1][2][2][0] == 'binary' && node[1][2][2][2][0] == 'name' && node[1][2][2][2][1] == 'tempDoublePtr' && - node[1][3][0] == 'sub' && node[1][3][1][0] == 'name' && (node[1][3][1][1] == 'HEAP32' || node[1][3][1][1] == 'HEAPF32')) { - if (node[1][2][1][1] == 'HEAP32') { - node[1][3][1][1] = 'HEAPF32'; - return ['unary-prefix', '+', node[1][3]]; - } else { - node[1][3][1][1] = 'HEAP32'; - return ['binary', '|', node[1][3], ['num', 0]]; - } } } }); if (asm) { + if (hasTempDoublePtr) { + traverse(ast, function(node, type) { + if (type == 'assign') { + if (node[1] === true && node[2][0] == 'sub' && node[2][1][0] == 'name' && node[2][1][1] == 'HEAP32') { + // remove bitcasts that are now obviously pointless, e.g. + // HEAP32[$45 >> 2] = HEAPF32[tempDoublePtr >> 2] = ($14 < $28 ? $14 : $28) - $42, HEAP32[tempDoublePtr >> 2] | 0; + var value = node[3]; + if (value[0] == 'seq' && value[1][0] == 'assign' && value[1][2][0] == 'sub' && value[1][2][1][0] == 'name' && value[1][2][1][1] == 'HEAPF32' && + value[1][2][2][0] == 'binary' && value[1][2][2][2][0] == 'name' && value[1][2][2][2][1] == 'tempDoublePtr') { + // transform to HEAPF32[$45 >> 2] = ($14 < $28 ? $14 : $28) - $42; + node[2][1][1] = 'HEAPF32'; + node[3] = value[1][3]; + } + } + } else if (type == 'seq') { + // (HEAP32[tempDoublePtr >> 2] = HEAP32[$37 >> 2], +HEAPF32[tempDoublePtr >> 2]) + // ==> + // +HEAPF32[$37 >> 2] + if (node[0] == 'seq' && node[1][0] == 'assign' && node[1][2][0] == 'sub' && node[1][2][1][0] == 'name' && + (node[1][2][1][1] == 'HEAP32' || node[1][2][1][1] == 'HEAPF32') && + node[1][2][2][0] == 'binary' && node[1][2][2][2][0] == 'name' && node[1][2][2][2][1] == 'tempDoublePtr' && + node[1][3][0] == 'sub' && node[1][3][1][0] == 'name' && (node[1][3][1][1] == 'HEAP32' || node[1][3][1][1] == 'HEAPF32')) { + if (node[1][2][1][1] == 'HEAP32') { + node[1][3][1][1] = 'HEAPF32'; + return ['unary-prefix', '+', node[1][3]]; + } else { + node[1][3][1][1] = 'HEAP32'; + return ['binary', '|', node[1][3], ['num', 0]]; + } + } + } + }); + } + // optimize num >> num, in asm we need this here since we do not run optimizeShifts traverseGenerated(ast, function(node, type) { if (type == 'binary' && node[1] == '>>' && node[2][0] == 'num' && node[3][0] == 'num') { diff --git a/tools/test-js-optimizer-asm-pre-output.js b/tools/test-js-optimizer-asm-pre-output.js index 2f1fca1d..ae1140b1 100644 --- a/tools/test-js-optimizer-asm-pre-output.js +++ b/tools/test-js-optimizer-asm-pre-output.js @@ -116,5 +116,7 @@ function tempDoublePtr($45, $14, $28, $42) { HEAP32[$world + 102916 >> 2] = _malloc(192) | 0; f(+HEAPF32[$45 >> 2]); g(HEAP32[$14 >> 2] | 0); + $42 = +HEAPF32[$42 >> 2]; + ch($42); } diff --git a/tools/test-js-optimizer-asm-pre.js b/tools/test-js-optimizer-asm-pre.js index 16a2566a..d28743c5 100644 --- a/tools/test-js-optimizer-asm-pre.js +++ b/tools/test-js-optimizer-asm-pre.js @@ -118,5 +118,7 @@ function tempDoublePtr($45, $14, $28, $42) { HEAP32[$world + 102916 >> 2] = _malloc(192) | 0; f((HEAP32[tempDoublePtr >> 2] = HEAP32[$45 >> 2], +HEAPF32[tempDoublePtr >> 2])); g((HEAPF32[tempDoublePtr >> 2] = HEAPF32[$14 >> 2], HEAP32[tempDoublePtr >> 2] | 0)); + $42 = (HEAP32[tempDoublePtr >> 2] = HEAP32[$42 >> 2] | 0, +HEAPF32[tempDoublePtr >> 2]); + ch($42); } // EMSCRIPTEN_GENERATED_FUNCTIONS: ["a", "b", "rett", "ret2t", "retf", "i32_8", "tempDoublePtr"] |