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 /tools/js-optimizer.js | |
parent | 5b49264399225763cf0ecad68e74259ba4b2c673 (diff) |
abort outlining if it leads to the new function or old function exceeding the original function in size
Diffstat (limited to 'tools/js-optimizer.js')
-rw-r--r-- | tools/js-optimizer.js | 11 |
1 files changed, 9 insertions, 2 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]; |