diff options
author | Alon Zakai <alonzakai@gmail.com> | 2012-05-12 12:00:38 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2012-05-12 12:00:38 -0700 |
commit | 039705fdcfc7bf6d1fe5e51494c6880b484f7cf3 (patch) | |
tree | 4a84d2e3b1de9942aa9d797647df1ecbb289d367 | |
parent | d3ed0aeb7874477814cf61d3797abd4f69d2f7e7 (diff) |
handle multiple var defs of the same var in registerize
-rw-r--r-- | tools/js-optimizer.js | 7 | ||||
-rw-r--r-- | tools/test-js-optimizer-regs-output.js | 16 | ||||
-rw-r--r-- | tools/test-js-optimizer-regs.js | 16 |
3 files changed, 35 insertions, 4 deletions
diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 57d62339..f968fec2 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -1150,7 +1150,10 @@ function registerize(ast, conservative) { if (type == 'var') { node[1].forEach(function(arg) { var name = arg[0]; - varUses[name] = 1; + if (!varUses[name]) { // may have multiple var definitions + varUses[name] = 0; + } + varUses[name]++; }); } }); @@ -1174,7 +1177,7 @@ function registerize(ast, conservative) { var loopRegs = []; var loops = 0; function decUse(name) { - if (!varUses[name]) return varRegs[name]; // no uses left, but still need to replace the name if it has a register + if (!varUses[name]) return false; // no uses left, or not a relevant variable var reg = varRegs[name]; if (!reg) { // acquire register diff --git a/tools/test-js-optimizer-regs-output.js b/tools/test-js-optimizer-regs-output.js index c0c6c923..f3322e11 100644 --- a/tools/test-js-optimizer-regs-output.js +++ b/tools/test-js-optimizer-regs-output.js @@ -62,4 +62,18 @@ function primes() { return 1; return null; } -// EMSCRIPTEN_GENERATED_FUNCTIONS: ["test", "primes"] +function atomic() { + var r1, r2, r3, r4; + r2 = STACKTOP; + STACKTOP += 4; + r1 = r2 >> 2; + HEAP32[r1] = 10; + r3 = (tempValue = HEAP32[r1], HEAP32[r1] == 10 && (HEAP32[r1] = 7), tempValue); + r4 = (r3 | 0) == 10 & 1; + r3 = HEAP32[r1]; + r1 = _printf(STRING_TABLE.__str | 0, (tempInt = STACKTOP, STACKTOP += 8, HEAP32[tempInt >> 2] = r3, HEAP32[tempInt + 4 >> 2] = r4, tempInt)); + STACKTOP = r2; + return 0; + return null; +} +// EMSCRIPTEN_GENERATED_FUNCTIONS: ["test", "primes", "atomic"] diff --git a/tools/test-js-optimizer-regs.js b/tools/test-js-optimizer-regs.js index 1dd7b9d3..d54ce508 100644 --- a/tools/test-js-optimizer-regs.js +++ b/tools/test-js-optimizer-regs.js @@ -65,4 +65,18 @@ function primes() { return 1; return null; } -// EMSCRIPTEN_GENERATED_FUNCTIONS: ["test", "primes"] +function atomic() { + var $x$s2; + var __stackBase__ = STACKTOP; + STACKTOP += 4; + var $x$s2 = __stackBase__ >> 2; + HEAP32[$x$s2] = 10; + var $0 = (tempValue = HEAP32[$x$s2], HEAP32[$x$s2] == 10 && (HEAP32[$x$s2] = 7), tempValue); + var $conv = ($0 | 0) == 10 & 1; + var $2 = HEAP32[$x$s2]; + var $call = _printf(STRING_TABLE.__str | 0, (tempInt = STACKTOP, STACKTOP += 8, HEAP32[tempInt >> 2] = $2, HEAP32[tempInt + 4 >> 2] = $conv, tempInt)); + STACKTOP = __stackBase__; + return 0; + return null; +} +// EMSCRIPTEN_GENERATED_FUNCTIONS: ["test", "primes", "atomic"] |