aboutsummaryrefslogtreecommitdiff
path: root/tools/js-optimizer.js
diff options
context:
space:
mode:
Diffstat (limited to 'tools/js-optimizer.js')
-rw-r--r--tools/js-optimizer.js28
1 files changed, 15 insertions, 13 deletions
diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js
index 22769bb4..77cb9bf2 100644
--- a/tools/js-optimizer.js
+++ b/tools/js-optimizer.js
@@ -3042,7 +3042,7 @@ function outline(ast) {
return [newFunc];
}
- function outlineStatements(func, asmData, stats) {
+ function outlineStatements(func, asmData, stats, maxSize) {
level++;
if (measureSize(stats) < sizeToOutline) return;
var ret = [];
@@ -3059,7 +3059,7 @@ function outline(ast) {
traverse(stat, function(node, type) {
if (type == 'block') {
if (measureSize(node) >= sizeToOutline) {
- var subRet = outlineStatements(func, asmData, node[1]);
+ var subRet = outlineStatements(func, asmData, node[1], maxSize);
if (subRet && subRet.length > 0) ret.push.apply(ret, subRet);
}
return null; // do not recurse into children, outlineStatements will do so if necessary
@@ -3069,17 +3069,19 @@ function outline(ast) {
continue;
}
sizeSeen += size;
- if (sizeSeen >= sizeToOutline) {
- if (i == 0 && end == stats.length-1) {
- // we have the full range here, so inlining would do nothing useful
- if (stats.length >= 2) {
- // at least split this function in half
- i = Math.floor(stats.length/2);
- end = stats.length-1;
- } else {
- break;
- }
+ // If this is big enough to outline, but no too big (if very close to the size of the full function,
+ // outlining is pointless; remove stats from the end to try to achieve the good case), then outline.
+ // Also, try to reduce the size if it is much larger than the hoped-for size
+ while ((sizeSeen > maxSize || sizeSeen > 2*sizeToOutline) && i < end) {
+ sizeSeen -= measureSize(stats[end]);
+ if (sizeSeen >= sizeToOutline) {
+ end--;
+ } else {
+ sizeSeen += measureSize(stats[end]); // abort, this took away too much
+ break;
}
+ }
+ if (sizeSeen >= sizeToOutline && sizeSeen <= maxSize) {
ret.push.apply(ret, doOutline(func, asmData, stats, i, end)); // outline [i, .. ,end] inclusive
sizeSeen = 0;
end = i-1;
@@ -3099,7 +3101,7 @@ function outline(ast) {
if (size >= sizeToOutline) {
aggressiveVariableElimination(func, asmData);
analyzeFunction(func, asmData);
- var ret = outlineStatements(func, asmData, getStatements(func));
+ var ret = outlineStatements(func, asmData, getStatements(func), 0.5*size);
if (ret && ret.length > 0) newFuncs.push.apply(newFuncs, ret);
}
denormalizeAsm(func, asmData);