aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2013-01-23 14:47:04 -0800
committerAlon Zakai <alonzakai@gmail.com>2013-01-23 14:47:04 -0800
commit52003dff628fe9cf13710f5dcdebd884046d70b5 (patch)
tree9f900cf144995c016130b9dabaf56ef0d49853a6
parent4802cc7c0b56ac587e1dac849badeb11763ef64f (diff)
add final asm return of proper type, not always int
-rw-r--r--tools/js-optimizer.js10
-rw-r--r--tools/test-js-optimizer-asm-regs-output.js7
-rw-r--r--tools/test-js-optimizer-asm-regs.js9
3 files changed, 21 insertions, 5 deletions
diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js
index 4a92d3cf..12754bb2 100644
--- a/tools/js-optimizer.js
+++ b/tools/js-optimizer.js
@@ -1416,7 +1416,7 @@ function registerize(ast) {
// We also mark local variables - i.e., having a var definition
var localVars = {};
var hasSwitch = false; // we cannot optimize variables if there is a switch
- var hasReturnValue = false;
+ var returnType = null; // for asm
traverse(fun, function(node, type) {
if (type == 'var') {
node[1].forEach(function(defined) { localVars[defined[0]] = 1 });
@@ -1429,7 +1429,7 @@ function registerize(ast) {
} else if (type == 'switch') {
hasSwitch = true;
} else if (asm && type == 'return' && node[1]) {
- hasReturnValue = true;
+ returnType = detectAsmCoercion(node[1]);
}
});
vacuum(fun);
@@ -1608,11 +1608,13 @@ function registerize(ast) {
denormalizeAsm(fun, finalAsmData);
// Add a final return if one is missing. This is not strictly a register operation, but
// this pass traverses the entire AST anyhow so adding it here is efficient.
- if (hasReturnValue) {
+ if (returnType !== null) {
var stats = getStatements(fun);
var last = stats[stats.length-1];
if (last[0] != 'return') {
- stats.push(['return', ['num', 0]]);
+ var returnValue = ['num', 0];
+ if (returnType == ASM_DOUBLE) returnValue = ['unary-prefix', '+', returnValue];
+ stats.push(['return', returnValue]);
}
}
}
diff --git a/tools/test-js-optimizer-asm-regs-output.js b/tools/test-js-optimizer-asm-regs-output.js
index 26d1d134..99bccd2e 100644
--- a/tools/test-js-optimizer-asm-regs-output.js
+++ b/tools/test-js-optimizer-asm-regs-output.js
@@ -31,4 +31,11 @@ function ret2t() {
return;
}
}
+function retf() {
+ if (f()) {
+ g();
+ return +h();
+ }
+ return +0;
+}
diff --git a/tools/test-js-optimizer-asm-regs.js b/tools/test-js-optimizer-asm-regs.js
index 9192f32e..0afced29 100644
--- a/tools/test-js-optimizer-asm-regs.js
+++ b/tools/test-js-optimizer-asm-regs.js
@@ -34,5 +34,12 @@ function ret2t() {
}
// missing final return, but no need
}
-// EMSCRIPTEN_GENERATED_FUNCTIONS: ["asm", "_doit", "rett", "ret2t"]
+function retf() {
+ if (f()) {
+ g();
+ return +h();
+ }
+ // missing final return, need it as a float
+}
+// EMSCRIPTEN_GENERATED_FUNCTIONS: ["asm", "_doit", "rett", "ret2t", "retf"]