aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tools/js-optimizer.js16
-rw-r--r--tools/test-js-optimizer-regs-output.js40
-rw-r--r--tools/test-js-optimizer-regs.js44
3 files changed, 92 insertions, 8 deletions
diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js
index a354a236..57d62339 100644
--- a/tools/js-optimizer.js
+++ b/tools/js-optimizer.js
@@ -1226,7 +1226,7 @@ function registerize(ast, conservative) {
// Remove all vars
traverse(fun, function(node, type) {
if (type == 'var') {
- var vars = node[1];
+ var vars = node[1].filter(function(varr) { return varr[1] });
if (vars.length > 1) {
var ret = ['stat', []];
var curr = ret[1];
@@ -1237,18 +1237,22 @@ function registerize(ast, conservative) {
}
curr[2] = ['assign', true, ['name', vars[vars.length-1][0]], vars[vars.length-1][1]];
return ret;
- } else {
+ } else if (vars.length == 1) {
return ['assign', true, ['name', vars[0][0]], vars[0][1]];
+ } else {
+ return emptyNode();
}
}
});
vacuum(fun);
// Add vars at the beginning
- var vars = [];
- for (var i = 1; i < nextReg; i++) {
- vars.push([fullNames[i]]);
+ if (nextReg > 1) {
+ var vars = [];
+ for (var i = 1; i < nextReg; i++) {
+ vars.push([fullNames[i]]);
+ }
+ getStatements(fun).unshift(['var', vars]);
}
- getStatements(fun).unshift(['var', vars]);
});
}
diff --git a/tools/test-js-optimizer-regs-output.js b/tools/test-js-optimizer-regs-output.js
index 8e5d2e63..c0c6c923 100644
--- a/tools/test-js-optimizer-regs-output.js
+++ b/tools/test-js-optimizer-regs-output.js
@@ -24,4 +24,42 @@ function test() {
r3 = f(), r1 = 100, r1 = 1e3, r1 = 1e5;
f(r3());
}
-// EMSCRIPTEN_GENERATED_FUNCTIONS: ["test"]
+function primes() {
+ var r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, r13, r14;
+ r1 = 2;
+ r2 = 0;
+ $_$2 : while (1) {
+ r3 = r1 | 0;
+ r4 = _sqrtf(r3);
+ r5 = 2;
+ $_$4 : while (1) {
+ r6 = r5 | 0;
+ r7 = r6 < r4;
+ if (!r7) {
+ r8 = 1;
+ break $_$4;
+ }
+ r9 = (r1 | 0) % (r5 | 0);
+ r10 = (r9 | 0) == 0;
+ if (r10) {
+ r8 = 0;
+ break $_$4;
+ }
+ r11 = r5 + 1 | 0;
+ r5 = r11;
+ }
+ r12 = r8 + r2 | 0;
+ r13 = r1 + 1 | 0;
+ r14 = (r12 | 0) < 1e5;
+ if (r14) {
+ r1 = r13;
+ r2 = r12;
+ } else {
+ break $_$2;
+ }
+ }
+ r12 = _printf(STRING_TABLE.__str | 0, (tempInt = STACKTOP, STACKTOP += 4, HEAP32[tempInt >> 2] = r1, tempInt));
+ return 1;
+ return null;
+}
+// EMSCRIPTEN_GENERATED_FUNCTIONS: ["test", "primes"]
diff --git a/tools/test-js-optimizer-regs.js b/tools/test-js-optimizer-regs.js
index 2be4ee6a..1dd7b9d3 100644
--- a/tools/test-js-optimizer-regs.js
+++ b/tools/test-js-optimizer-regs.js
@@ -23,4 +23,46 @@ function test() {
var ck = f(), ck2 = 100, ck3 = 1000, ck4 = 100000;
f(ck());
}
-// EMSCRIPTEN_GENERATED_FUNCTIONS: ["test"]
+function primes() {
+ var __label__;
+ var $curri_01 = 2;
+ var $primes_02 = 0;
+ $_$2 : while (1) {
+ var $primes_02;
+ var $curri_01;
+ var $conv1 = $curri_01 | 0;
+ var $call = _sqrtf($conv1);
+ var $j_0 = 2;
+ $_$4 : while (1) {
+ var $j_0;
+ var $conv = $j_0 | 0;
+ var $cmp2 = $conv < $call;
+ if (!$cmp2) {
+ var $ok_0 = 1;
+ break $_$4;
+ }
+ var $rem = ($curri_01 | 0) % ($j_0 | 0);
+ var $cmp3 = ($rem | 0) == 0;
+ if ($cmp3) {
+ var $ok_0 = 0;
+ break $_$4;
+ }
+ var $inc = $j_0 + 1 | 0;
+ var $j_0 = $inc;
+ }
+ var $ok_0;
+ var $inc5_primes_0 = $ok_0 + $primes_02 | 0;
+ var $inc7 = $curri_01 + 1 | 0;
+ var $cmp = ($inc5_primes_0 | 0) < 1e5;
+ if ($cmp) {
+ var $curri_01 = $inc7;
+ var $primes_02 = $inc5_primes_0;
+ } else {
+ break $_$2;
+ }
+ }
+ var $call8 = _printf(STRING_TABLE.__str | 0, (tempInt = STACKTOP, STACKTOP += 4, HEAP32[tempInt >> 2] = $curri_01, tempInt));
+ return 1;
+ return null;
+}
+// EMSCRIPTEN_GENERATED_FUNCTIONS: ["test", "primes"]