diff options
author | Alon Zakai <alonzakai@gmail.com> | 2012-05-11 21:08:06 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2012-05-11 21:08:06 -0700 |
commit | b1ad0fe49869321309a70bfac7913023b58a4150 (patch) | |
tree | 840609bc9d8d34c8ae049037849cd64aea91063c | |
parent | 6ee8575a3be5159d65942e61595924d5e7a4b93c (diff) |
registerize: define all vars once up front
-rw-r--r-- | tools/js-optimizer.js | 29 | ||||
-rw-r--r-- | tools/test-js-optimizer-regs-output.js | 25 |
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"] |