aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2012-05-12 12:00:38 -0700
committerAlon Zakai <alonzakai@gmail.com>2012-05-12 12:00:38 -0700
commit039705fdcfc7bf6d1fe5e51494c6880b484f7cf3 (patch)
tree4a84d2e3b1de9942aa9d797647df1ecbb289d367
parentd3ed0aeb7874477814cf61d3797abd4f69d2f7e7 (diff)
handle multiple var defs of the same var in registerize
-rw-r--r--tools/js-optimizer.js7
-rw-r--r--tools/test-js-optimizer-regs-output.js16
-rw-r--r--tools/test-js-optimizer-regs.js16
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"]