diff options
author | Alon Zakai <alonzakai@gmail.com> | 2013-07-21 10:55:08 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2013-07-21 10:55:08 -0700 |
commit | 00ba7f537875a698c9f0aaf4ea7d40ef13868bcb (patch) | |
tree | 7f45a71c20500baa153f448ea64f0ff08f70ea82 | |
parent | 5b49264399225763cf0ecad68e74259ba4b2c673 (diff) |
abort outlining if it leads to the new function or old function exceeding the original function in size
-rw-r--r-- | tools/js-optimizer.js | 11 | ||||
-rw-r--r-- | tools/test-js-optimizer-asm-outline1.js | 2 | ||||
-rw-r--r-- | tools/test-js-optimizer-asm-outline2.js | 2 |
3 files changed, 11 insertions, 4 deletions
diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 055cf7e8..46b9c731 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -3123,6 +3123,7 @@ function outline(ast) { var costs = {}; // new function name => overhead cost of outlining function doOutline(func, asmData, stats, start, end) { + if (!extraInfo.allowCostlyOutlines) var originalStats = copy(stats); var code = stats.slice(start, end+1); var funcSize = measureSize(func); var newIdent = func[1] + '$' + (asmData.splitCounter++); @@ -3307,11 +3308,17 @@ function outline(ast) { if (v != 'sp') newAsmData.vars[v] = getAsmType(v, asmData); } denormalizeAsm(newFunc, newAsmData); + // replace in stats + stats.splice.apply(stats, [start, end-start+1].concat(reps)); + if (!extraInfo.allowCostlyOutlines && (measureSize(func) >= funcSize || measureSize(newFunc) >= funcSize)) { + // abort, this was pointless + stats.length = originalStats.length; + for (var i = 0; i < stats.length; i++) stats[i] = originalStats[i]; + return []; + } for (var v in owned) { if (v != 'sp') delete asmData.vars[v]; // parent does not need these anymore } - // replace in stats - stats.splice.apply(stats, [start, end-start+1].concat(reps)); // if we just removed a final return from the original function, add one var last = getStatements(func)[getStatements(func).length-1]; if (last[0] === 'stat') last = last[1]; diff --git a/tools/test-js-optimizer-asm-outline1.js b/tools/test-js-optimizer-asm-outline1.js index 0c4b205a..40026439 100644 --- a/tools/test-js-optimizer-asm-outline1.js +++ b/tools/test-js-optimizer-asm-outline1.js @@ -231,4 +231,4 @@ function vars_w_stack(x, y) { STACKTOP = sp; } // EMSCRIPTEN_GENERATED_FUNCTIONS -// EXTRA_INFO: { "sizeToOutline": 30 } +// EXTRA_INFO: { "sizeToOutline": 30, "allowCostlyOutlines": 1 } diff --git a/tools/test-js-optimizer-asm-outline2.js b/tools/test-js-optimizer-asm-outline2.js index 153d7feb..5da6e04a 100644 --- a/tools/test-js-optimizer-asm-outline2.js +++ b/tools/test-js-optimizer-asm-outline2.js @@ -603,4 +603,4 @@ function _free($mem) { return; } // EMSCRIPTEN_GENERATED_FUNCTIONS -// EXTRA_INFO: { "sizeToOutline": 1000 } +// EXTRA_INFO: { "sizeToOutline": 1000, "allowCostlyOutlines": 1 } |