aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tools/js-optimizer.js29
-rw-r--r--tools/test-js-optimizer-regs-output.js25
2 files changed, 40 insertions, 14 deletions
diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js
index d51c1c18..a354a236 100644
--- a/tools/js-optimizer.js
+++ b/tools/js-optimizer.js
@@ -1182,7 +1182,7 @@ function registerize(ast, conservative) {
reg = freeRegs.pop();
} else {
reg = nextReg++;
- fullNames[reg] = 'r' + reg;
+ fullNames[reg] = 'r' + reg; // TODO: even smaller names
}
varRegs[name] = reg;
}
@@ -1223,8 +1223,33 @@ function registerize(ast, conservative) {
}
}
});
+ // Remove all vars
+ traverse(fun, function(node, type) {
+ if (type == 'var') {
+ var vars = node[1];
+ if (vars.length > 1) {
+ var ret = ['stat', []];
+ var curr = ret[1];
+ for (var i = 0; i < vars.length-1; i++) {
+ curr[0] = 'seq';
+ curr[1] = ['assign', true, ['name', vars[i][0]], vars[i][1]];
+ if (i != vars.length-2) curr = curr[2] = [];
+ }
+ curr[2] = ['assign', true, ['name', vars[vars.length-1][0]], vars[vars.length-1][1]];
+ return ret;
+ } else {
+ return ['assign', true, ['name', vars[0][0]], vars[0][1]];
+ }
+ }
+ });
+ vacuum(fun);
+ // Add vars at the beginning
+ var vars = [];
+ for (var i = 1; i < nextReg; i++) {
+ vars.push([fullNames[i]]);
+ }
+ getStatements(fun).unshift(['var', vars]);
});
- //printErr('zz post: ' + dump(ast));
}
// Passes table
diff --git a/tools/test-js-optimizer-regs-output.js b/tools/test-js-optimizer-regs-output.js
index 30b504be..8e5d2e63 100644
--- a/tools/test-js-optimizer-regs-output.js
+++ b/tools/test-js-optimizer-regs-output.js
@@ -1,26 +1,27 @@
function test() {
- var r1 = 0;
+ var r1, r2, r3;
+ r1 = 0;
f(r1);
r1++;
- var r2 = r1 + 2;
+ r2 = r1 + 2;
g(r1, r2);
f(r1);
- var r1 = cheez();
- var r2 = r1 + 2;
+ r1 = cheez();
+ r2 = r1 + 2;
g(r2, r2);
- var r2 = 200;
- var r2 = 203;
- var r2 = 205;
- var r1 = 208;
+ r2 = 200;
+ r2 = 203;
+ r2 = 205;
+ r1 = 208;
c(r2);
while (f()) {
- var r2 = 5;
- var r1 = 12;
+ r2 = 5;
+ r1 = 12;
gg(r2, r1 * 2);
- var r3 = 100;
+ r3 = 100;
gg(r3, 20);
}
- var r3 = f(), r1 = 100, r1 = 1e3, r1 = 1e5;
+ r3 = f(), r1 = 100, r1 = 1e3, r1 = 1e5;
f(r3());
}
// EMSCRIPTEN_GENERATED_FUNCTIONS: ["test"]