diff options
author | Alon Zakai <alonzakai@gmail.com> | 2012-05-16 11:15:36 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2012-05-16 11:15:36 -0700 |
commit | 74fd2c236f8865d1a9c00bdace466bee8ed2eb1c (patch) | |
tree | 63e5f847a92fc54a2aed1de51582fdff9df6f6c3 | |
parent | f0d31ed4996a3f194f81d40fc14d1cbc93dd9a42 (diff) |
bugfix in registerize
-rw-r--r-- | tools/js-optimizer.js | 8 | ||||
-rw-r--r-- | tools/test-js-optimizer-regs-output.js | 20 |
2 files changed, 16 insertions, 12 deletions
diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index e76f58f2..59492dbd 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -1223,6 +1223,10 @@ function registerize(ast) { // since they can potentially be returned to. Optimizable variables lock onto // loops that they enter, unoptimizable variables lock in a conservative way // into the topmost loop. + // Note that we cannot lock onto a variable in a loop if it was used and free'd + // before! (then they could overwrite us in the early part of the loop). For now + // we just use a fresh register to make sure we avoid this, but it could be + // optimized to check for safe registers (free, and not used in this loop level). var varRegs = {}; // maps variables to the register they will use all their life var freeRegs = []; var nextReg = 1; @@ -1238,7 +1242,7 @@ function registerize(ast) { var reg = varRegs[name]; if (!reg) { // acquire register - if (freeRegs.length > 0) { + if (optimizables[name] && freeRegs.length > 0) { reg = freeRegs.pop(); saved++; } else { @@ -1301,7 +1305,7 @@ function registerize(ast) { } getStatements(fun).unshift(['var', vars]); } - printErr(fun[1] + ': saved ' + saved + ' vars through registerization'); + printErr(fun[1] + ': saved ' + saved + ' / ' + (saved + nextReg - 1) + ' vars through registerization'); // not totally accurate }); } diff --git a/tools/test-js-optimizer-regs-output.js b/tools/test-js-optimizer-regs-output.js index be8af33b..bd14f856 100644 --- a/tools/test-js-optimizer-regs-output.js +++ b/tools/test-js-optimizer-regs-output.js @@ -36,22 +36,22 @@ function primes() { r5 = r3 | 0; r6 = r5 < r4; if (!r6) { - r6 = 1; + r7 = 1; break $_$4; } - r5 = (r1 | 0) % (r3 | 0); - r7 = (r5 | 0) == 0; - if (r7) { - r6 = 0; + r6 = (r1 | 0) % (r3 | 0); + r5 = (r6 | 0) == 0; + if (r5) { + r7 = 0; break $_$4; } - r7 = r3 + 1 | 0; - r3 = r7; + r5 = r3 + 1 | 0; + r3 = r5; } - r3 = r6 + r2 | 0; + r3 = r7 + r2 | 0; r4 = r1 + 1 | 0; - r7 = (r3 | 0) < 1e5; - if (r7) { + r5 = (r3 | 0) < 1e5; + if (r5) { r1 = r4; r2 = r3; } else { |