aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2013-07-20 20:47:28 -0700
committerAlon Zakai <alonzakai@gmail.com>2013-07-20 20:47:28 -0700
commita5bb34ba04e1d17a59fda20f6a7e82c64f6ed6cc (patch)
tree38d57726e2e1ab1b11cb019f6687e3b5abed8bdb
parente258efc2aa3d52ff3c3d4f6ee03f6e71aca4f084 (diff)
adjust outlining heuristics to fully outline even big functions
-rw-r--r--tools/js-optimizer.js4
-rw-r--r--tools/test-js-optimizer-asm-outline2-output.js356
2 files changed, 196 insertions, 164 deletions
diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js
index 24166aa8..810edd46 100644
--- a/tools/js-optimizer.js
+++ b/tools/js-optimizer.js
@@ -3327,9 +3327,9 @@ function outline(ast) {
// (but only if the total costs are not extravagant)
var currSize = measureSize(stats);
var outlinedSize = measureSize(ret);
- if (canRestart && currSize > sizeToOutline && sum(ret.map(function(newFunc) {
+ if (canRestart && currSize > 1.2*sizeToOutline && sum(ret.map(function(newFunc) {
return costs[newFunc[1]] || 0;
- })) < 0.1*sizeToOutline) {
+ })) < 0.5*originalSize) {
printErr('restarting ' + func[1] + ' since ' + [currSize, outlinedSize, originalSize] + ' in level ' + level);
lastSize = currSize;
i = stats.length;
diff --git a/tools/test-js-optimizer-asm-outline2-output.js b/tools/test-js-optimizer-asm-outline2-output.js
index 5c46243a..f3ab307d 100644
--- a/tools/test-js-optimizer-asm-outline2-output.js
+++ b/tools/test-js-optimizer-asm-outline2-output.js
@@ -21,7 +21,7 @@ function linear() {
}
function _free($mem) {
$mem = $mem | 0;
- var $5 = 0, $10 = 0, $16 = 0, $21 = 0, $25 = 0, $26 = 0, $psize_0 = 0, $p_0 = 0, $189 = 0, $194 = 0, $204 = 0, $psize_1 = 0, $390 = 0, $396 = 0, $404 = 0, $_pre_phi = 0, $F16_0 = 0, $414 = 0, $415 = 0, $428 = 0, $436 = 0, $I18_0 = 0, $443 = 0, $447 = 0, $448 = 0, $463 = 0, $T_0 = 0, $K19_0 = 0, $472 = 0, $473 = 0, $486 = 0, $487 = 0, $489 = 0, $501 = 0, $sp_0_in_i = 0, $sp_0_i = 0, label = 0, sp = 0;
+ var $5 = 0, $10 = 0, $16 = 0, $21 = 0, $25 = 0, $26 = 0, $psize_0 = 0, $p_0 = 0, $189 = 0, $194 = 0, sp = 0;
sp = STACKTOP;
if (($mem | 0) == 0) {
STACKTOP = sp;
@@ -85,169 +85,19 @@ function _free($mem) {
if (($194 & 1 | 0) == 0) {
_abort();
}
- do {
- if (($194 & 2 | 0) == 0) {
- if (($16 | 0) == (HEAP32[26] | 0)) {
- $204 = (HEAP32[23] | 0) + $psize_0 | 0;
- HEAP32[23] = $204;
- HEAP32[26] = $p_0;
- HEAP32[$p_0 + 4 >> 2] = $204 | 1;
- if (($p_0 | 0) == (HEAP32[25] | 0)) {
- HEAP32[25] = 0;
- HEAP32[22] = 0;
- }
- if ($204 >>> 0 <= (HEAP32[27] | 0) >>> 0) {
- return;
- }
- _sys_trim(0) | 0;
- return;
- }
- HEAP32[sp + 632 >> 2] = 0;
- HEAP32[sp + 640 >> 2] = 0;
- HEAP32[sp + 24 >> 2] = $16;
- HEAP32[sp + 208 >> 2] = $psize_0;
- HEAP32[sp + 216 >> 2] = $p_0;
- HEAP32[sp + 224 >> 2] = $189;
- HEAP32[sp + 232 >> 2] = $194;
- HEAP32[sp + 0 >> 2] = $mem;
- HEAP32[sp + 16 >> 2] = $10;
- HEAP32[sp + 416 >> 2] = $psize_1;
- _free$0(sp);
- $psize_1 = HEAP32[sp + 416 >> 2] | 0;
- if ((HEAP32[sp + 632 >> 2] | 0) == 5) {
- return;
- }
- if ((HEAP32[sp + 632 >> 2] | 0) == 1) {
- break;
- }
- } else {
- HEAP32[($mem + (($10 & -8) - 4) | 0) >> 2] = $194 & -2;
- HEAP32[$p_0 + 4 >> 2] = $psize_0 | 1;
- HEAP32[$189 + $psize_0 >> 2] = $psize_0;
- $psize_1 = $psize_0;
- }
- } while (0);
- $390 = $psize_1 >>> 3;
- if ($psize_1 >>> 0 < 256) {
- $396 = HEAP32[20] | 0;
- do {
- if (($396 & 1 << $390 | 0) == 0) {
- HEAP32[20] = $396 | 1 << $390;
- $F16_0 = 120 + ($390 << 1 << 2) | 0;
- $_pre_phi = 120 + (($390 << 1) + 2 << 2) | 0;
- } else {
- $404 = HEAP32[(120 + (($390 << 1) + 2 << 2) | 0) >> 2] | 0;
- if ($404 >>> 0 >= (HEAP32[24] | 0) >>> 0) {
- $F16_0 = $404;
- $_pre_phi = 120 + (($390 << 1) + 2 << 2) | 0;
- break;
- }
- _abort();
- }
- } while (0);
- HEAP32[$_pre_phi >> 2] = $p_0;
- HEAP32[$F16_0 + 12 >> 2] = $p_0;
- HEAP32[$p_0 + 8 >> 2] = $F16_0;
- HEAP32[$p_0 + 12 >> 2] = 120 + ($390 << 1 << 2) | 0;
- return;
- }
- $414 = $p_0;
- $415 = $psize_1 >>> 8;
- do {
- if (($415 | 0) == 0) {
- $I18_0 = 0;
- } else {
- if ($psize_1 >>> 0 > 16777215) {
- $I18_0 = 31;
- break;
- }
- $428 = $415 << (($415 + 1048320 | 0) >>> 16 & 8) << ((($415 << (($415 + 1048320 | 0) >>> 16 & 8)) + 520192 | 0) >>> 16 & 4);
- $436 = 14 - ((($415 << (($415 + 1048320 | 0) >>> 16 & 8)) + 520192 | 0) >>> 16 & 4 | ($415 + 1048320 | 0) >>> 16 & 8 | ($428 + 245760 | 0) >>> 16 & 2) + ($428 << (($428 + 245760 | 0) >>> 16 & 2) >>> 15) | 0;
- $I18_0 = $psize_1 >>> (($436 + 7 | 0) >>> 0) & 1 | $436 << 1;
- }
- } while (0);
- $443 = 384 + ($I18_0 << 2) | 0;
- HEAP32[$p_0 + 28 >> 2] = $I18_0;
- HEAP32[$p_0 + 20 >> 2] = 0;
- HEAP32[$p_0 + 16 >> 2] = 0;
- $447 = HEAP32[21] | 0;
- $448 = 1 << $I18_0;
- do {
- if (($447 & $448 | 0) == 0) {
- HEAP32[21] = $447 | $448;
- HEAP32[$443 >> 2] = $414;
- HEAP32[$p_0 + 24 >> 2] = $443;
- HEAP32[$p_0 + 12 >> 2] = $p_0;
- HEAP32[$p_0 + 8 >> 2] = $p_0;
- } else {
- if (($I18_0 | 0) == 31) {
- $463 = 0;
- } else {
- $463 = 25 - ($I18_0 >>> 1) | 0;
- }
- $K19_0 = $psize_1 << $463;
- $T_0 = HEAP32[$443 >> 2] | 0;
- while (1) {
- if ((HEAP32[$T_0 + 4 >> 2] & -8 | 0) == ($psize_1 | 0)) {
- break;
- }
- $472 = $T_0 + 16 + ($K19_0 >>> 31 << 2) | 0;
- $473 = HEAP32[$472 >> 2] | 0;
- if (($473 | 0) == 0) {
- label = 569;
- break;
- } else {
- $K19_0 = $K19_0 << 1;
- $T_0 = $473;
- }
- }
- if ((label | 0) == 569) {
- if ($472 >>> 0 < (HEAP32[24] | 0) >>> 0) {
- _abort();
- } else {
- HEAP32[$472 >> 2] = $414;
- HEAP32[$p_0 + 24 >> 2] = $T_0;
- HEAP32[$p_0 + 12 >> 2] = $p_0;
- HEAP32[$p_0 + 8 >> 2] = $p_0;
- break;
- }
- }
- $486 = $T_0 + 8 | 0;
- $487 = HEAP32[$486 >> 2] | 0;
- $489 = HEAP32[24] | 0;
- if ($T_0 >>> 0 < $489 >>> 0) {
- _abort();
- }
- if ($487 >>> 0 < $489 >>> 0) {
- _abort();
- } else {
- HEAP32[$487 + 12 >> 2] = $414;
- HEAP32[$486 >> 2] = $414;
- HEAP32[$p_0 + 8 >> 2] = $487;
- HEAP32[$p_0 + 12 >> 2] = $T_0;
- HEAP32[$p_0 + 24 >> 2] = 0;
- break;
- }
- }
- } while (0);
- $501 = (HEAP32[28] | 0) - 1 | 0;
- HEAP32[28] = $501;
- if (($501 | 0) == 0) {
- $sp_0_in_i = 536;
- } else {
+ HEAP32[sp + 632 >> 2] = 0;
+ HEAP32[sp + 640 >> 2] = 0;
+ HEAP32[sp + 232 >> 2] = $194;
+ HEAP32[sp + 24 >> 2] = $16;
+ HEAP32[sp + 208 >> 2] = $psize_0;
+ HEAP32[sp + 216 >> 2] = $p_0;
+ HEAP32[sp + 224 >> 2] = $189;
+ HEAP32[sp + 0 >> 2] = $mem;
+ HEAP32[sp + 16 >> 2] = $10;
+ _free$2(sp);
+ if ((HEAP32[sp + 632 >> 2] | 0) == 5) {
return;
}
- while (1) {
- $sp_0_i = HEAP32[$sp_0_in_i >> 2] | 0;
- if (($sp_0_i | 0) == 0) {
- break;
- } else {
- $sp_0_in_i = $sp_0_i + 8 | 0;
- }
- }
- HEAP32[28] = -1;
- STACKTOP = sp;
- return;
}
function linear$0(sp) {
sp = sp | 0;
@@ -671,4 +521,186 @@ function _free$1(sp) {
HEAP32[sp + 216 >> 2] = $p_0;
HEAP32[sp + 208 >> 2] = $psize_0;
}
+function _free$2(sp) {
+ sp = sp | 0;
+ var $194 = 0, $16 = 0, $204 = 0, $psize_0 = 0, $p_0 = 0, $189 = 0, $mem = 0, $10 = 0, $psize_1 = 0, $390 = 0, $396 = 0, $F16_0 = 0, $_pre_phi = 0, $404 = 0, $414 = 0, $415 = 0, $I18_0 = 0, $428 = 0, $436 = 0, $443 = 0, $447 = 0, $448 = 0, $463 = 0, $K19_0 = 0, $T_0 = 0, $472 = 0, $473 = 0, label = 0, $486 = 0, $487 = 0, $489 = 0, $501 = 0, $sp_0_in_i = 0, $sp_0_i = 0;
+ $10 = HEAP32[sp + 16 >> 2] | 0;
+ $mem = HEAP32[sp + 0 >> 2] | 0;
+ $189 = HEAP32[sp + 224 >> 2] | 0;
+ $p_0 = HEAP32[sp + 216 >> 2] | 0;
+ $psize_0 = HEAP32[sp + 208 >> 2] | 0;
+ $16 = HEAP32[sp + 24 >> 2] | 0;
+ $194 = HEAP32[sp + 232 >> 2] | 0;
+ OL : do {
+ do {
+ if (($194 & 2 | 0) == 0) {
+ if (($16 | 0) == (HEAP32[26] | 0)) {
+ $204 = (HEAP32[23] | 0) + $psize_0 | 0;
+ HEAP32[23] = $204;
+ HEAP32[26] = $p_0;
+ HEAP32[$p_0 + 4 >> 2] = $204 | 1;
+ if (($p_0 | 0) == (HEAP32[25] | 0)) {
+ HEAP32[25] = 0;
+ HEAP32[22] = 0;
+ }
+ if ($204 >>> 0 <= (HEAP32[27] | 0) >>> 0) {
+ HEAP32[sp + 632 >> 2] = 5;
+ break OL;
+ }
+ _sys_trim(0) | 0;
+ HEAP32[sp + 632 >> 2] = 5;
+ break OL;
+ }
+ HEAP32[sp + 632 >> 2] = 0;
+ HEAP32[sp + 640 >> 2] = 0;
+ HEAP32[sp + 24 >> 2] = $16;
+ HEAP32[sp + 208 >> 2] = $psize_0;
+ HEAP32[sp + 216 >> 2] = $p_0;
+ HEAP32[sp + 224 >> 2] = $189;
+ HEAP32[sp + 232 >> 2] = $194;
+ HEAP32[sp + 0 >> 2] = $mem;
+ HEAP32[sp + 16 >> 2] = $10;
+ HEAP32[sp + 416 >> 2] = $psize_1;
+ _free$0(sp);
+ $psize_1 = HEAP32[sp + 416 >> 2] | 0;
+ if ((HEAP32[sp + 632 >> 2] | 0) == 5) {
+ HEAP32[sp + 632 >> 2] = 5;
+ break OL;
+ }
+ if ((HEAP32[sp + 632 >> 2] | 0) == 1) {
+ break;
+ }
+ } else {
+ HEAP32[($mem + (($10 & -8) - 4) | 0) >> 2] = $194 & -2;
+ HEAP32[$p_0 + 4 >> 2] = $psize_0 | 1;
+ HEAP32[$189 + $psize_0 >> 2] = $psize_0;
+ $psize_1 = $psize_0;
+ }
+ } while (0);
+ $390 = $psize_1 >>> 3;
+ if ($psize_1 >>> 0 < 256) {
+ $396 = HEAP32[20] | 0;
+ do {
+ if (($396 & 1 << $390 | 0) == 0) {
+ HEAP32[20] = $396 | 1 << $390;
+ $F16_0 = 120 + ($390 << 1 << 2) | 0;
+ $_pre_phi = 120 + (($390 << 1) + 2 << 2) | 0;
+ } else {
+ $404 = HEAP32[(120 + (($390 << 1) + 2 << 2) | 0) >> 2] | 0;
+ if ($404 >>> 0 >= (HEAP32[24] | 0) >>> 0) {
+ $F16_0 = $404;
+ $_pre_phi = 120 + (($390 << 1) + 2 << 2) | 0;
+ break;
+ }
+ _abort();
+ }
+ } while (0);
+ HEAP32[$_pre_phi >> 2] = $p_0;
+ HEAP32[$F16_0 + 12 >> 2] = $p_0;
+ HEAP32[$p_0 + 8 >> 2] = $F16_0;
+ HEAP32[$p_0 + 12 >> 2] = 120 + ($390 << 1 << 2) | 0;
+ HEAP32[sp + 632 >> 2] = 5;
+ break OL;
+ }
+ $414 = $p_0;
+ $415 = $psize_1 >>> 8;
+ do {
+ if (($415 | 0) == 0) {
+ $I18_0 = 0;
+ } else {
+ if ($psize_1 >>> 0 > 16777215) {
+ $I18_0 = 31;
+ break;
+ }
+ $428 = $415 << (($415 + 1048320 | 0) >>> 16 & 8) << ((($415 << (($415 + 1048320 | 0) >>> 16 & 8)) + 520192 | 0) >>> 16 & 4);
+ $436 = 14 - ((($415 << (($415 + 1048320 | 0) >>> 16 & 8)) + 520192 | 0) >>> 16 & 4 | ($415 + 1048320 | 0) >>> 16 & 8 | ($428 + 245760 | 0) >>> 16 & 2) + ($428 << (($428 + 245760 | 0) >>> 16 & 2) >>> 15) | 0;
+ $I18_0 = $psize_1 >>> (($436 + 7 | 0) >>> 0) & 1 | $436 << 1;
+ }
+ } while (0);
+ $443 = 384 + ($I18_0 << 2) | 0;
+ HEAP32[$p_0 + 28 >> 2] = $I18_0;
+ HEAP32[$p_0 + 20 >> 2] = 0;
+ HEAP32[$p_0 + 16 >> 2] = 0;
+ $447 = HEAP32[21] | 0;
+ $448 = 1 << $I18_0;
+ do {
+ if (($447 & $448 | 0) == 0) {
+ HEAP32[21] = $447 | $448;
+ HEAP32[$443 >> 2] = $414;
+ HEAP32[$p_0 + 24 >> 2] = $443;
+ HEAP32[$p_0 + 12 >> 2] = $p_0;
+ HEAP32[$p_0 + 8 >> 2] = $p_0;
+ } else {
+ if (($I18_0 | 0) == 31) {
+ $463 = 0;
+ } else {
+ $463 = 25 - ($I18_0 >>> 1) | 0;
+ }
+ $K19_0 = $psize_1 << $463;
+ $T_0 = HEAP32[$443 >> 2] | 0;
+ while (1) {
+ if ((HEAP32[$T_0 + 4 >> 2] & -8 | 0) == ($psize_1 | 0)) {
+ break;
+ }
+ $472 = $T_0 + 16 + ($K19_0 >>> 31 << 2) | 0;
+ $473 = HEAP32[$472 >> 2] | 0;
+ if (($473 | 0) == 0) {
+ label = 569;
+ break;
+ } else {
+ $K19_0 = $K19_0 << 1;
+ $T_0 = $473;
+ }
+ }
+ if ((label | 0) == 569) {
+ if ($472 >>> 0 < (HEAP32[24] | 0) >>> 0) {
+ _abort();
+ } else {
+ HEAP32[$472 >> 2] = $414;
+ HEAP32[$p_0 + 24 >> 2] = $T_0;
+ HEAP32[$p_0 + 12 >> 2] = $p_0;
+ HEAP32[$p_0 + 8 >> 2] = $p_0;
+ break;
+ }
+ }
+ $486 = $T_0 + 8 | 0;
+ $487 = HEAP32[$486 >> 2] | 0;
+ $489 = HEAP32[24] | 0;
+ if ($T_0 >>> 0 < $489 >>> 0) {
+ _abort();
+ }
+ if ($487 >>> 0 < $489 >>> 0) {
+ _abort();
+ } else {
+ HEAP32[$487 + 12 >> 2] = $414;
+ HEAP32[$486 >> 2] = $414;
+ HEAP32[$p_0 + 8 >> 2] = $487;
+ HEAP32[$p_0 + 12 >> 2] = $T_0;
+ HEAP32[$p_0 + 24 >> 2] = 0;
+ break;
+ }
+ }
+ } while (0);
+ $501 = (HEAP32[28] | 0) - 1 | 0;
+ HEAP32[28] = $501;
+ if (($501 | 0) == 0) {
+ $sp_0_in_i = 536;
+ } else {
+ HEAP32[sp + 632 >> 2] = 5;
+ break OL;
+ }
+ while (1) {
+ $sp_0_i = HEAP32[$sp_0_in_i >> 2] | 0;
+ if (($sp_0_i | 0) == 0) {
+ break;
+ } else {
+ $sp_0_in_i = $sp_0_i + 8 | 0;
+ }
+ }
+ HEAP32[28] = -1;
+ STACKTOP = sp;
+ HEAP32[sp + 632 >> 2] = 5;
+ break OL;
+ } while (0);
+}