aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2013-07-21 10:55:08 -0700
committerAlon Zakai <alonzakai@gmail.com>2013-07-21 10:55:08 -0700
commit00ba7f537875a698c9f0aaf4ea7d40ef13868bcb (patch)
tree7f45a71c20500baa153f448ea64f0ff08f70ea82
parent5b49264399225763cf0ecad68e74259ba4b2c673 (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.js11
-rw-r--r--tools/test-js-optimizer-asm-outline1.js2
-rw-r--r--tools/test-js-optimizer-asm-outline2.js2
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 }