summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2015-11-22 10:34:50 -0800
committerAlon Zakai <alonzakai@gmail.com>2015-11-22 10:35:32 -0800
commitac1d0f855f3fde65753aeea546c6781dbfd331ba (patch)
treecb67da35b95df91b7b14e5a55cda73605ec0aeee
parentf9764009d8df47eeddf9e542705bb6a5e7d397b0 (diff)
downloadbinaryen-ac1d0f855f3fde65753aeea546c6781dbfd331ba.tar.gz
binaryen-ac1d0f855f3fde65753aeea546c6781dbfd331ba.tar.bz2
binaryen-ac1d0f855f3fde65753aeea546c6781dbfd331ba.zip
fix detectSign on recursive calls that need minified fround
-rw-r--r--src/emscripten-optimizer/optimizer-shared.cpp8
-rw-r--r--test/min.asm.js11
-rw-r--r--test/min.wast16
3 files changed, 30 insertions, 5 deletions
diff --git a/src/emscripten-optimizer/optimizer-shared.cpp b/src/emscripten-optimizer/optimizer-shared.cpp
index c67b8332a..24c19cd79 100644
--- a/src/emscripten-optimizer/optimizer-shared.cpp
+++ b/src/emscripten-optimizer/optimizer-shared.cpp
@@ -69,7 +69,7 @@ AsmType detectType(Ref node, AsmData *asmData, bool inVarDef, IString minifiedFr
if (node[0] == UNARY_PREFIX) {
switch (node[1]->getCString()[0]) {
case '+': return ASM_DOUBLE;
- case '-': return detectType(node[2], asmData, inVarDef);
+ case '-': return detectType(node[2], asmData, inVarDef, minifiedFround);
case '!': case '~': return ASM_INT;
}
break;
@@ -89,7 +89,7 @@ AsmType detectType(Ref node, AsmData *asmData, bool inVarDef, IString minifiedFr
}
return ASM_NONE;
} else if (node[0] == CONDITIONAL) {
- return detectType(node[2], asmData, inVarDef);
+ return detectType(node[2], asmData, inVarDef, minifiedFround);
}
break;
}
@@ -97,7 +97,7 @@ AsmType detectType(Ref node, AsmData *asmData, bool inVarDef, IString minifiedFr
if (node[0] == BINARY) {
switch (node[1]->getCString()[0]) {
case '+': case '-':
- case '*': case '/': case '%': return detectType(node[2], asmData, inVarDef);
+ case '*': case '/': case '%': return detectType(node[2], asmData, inVarDef, minifiedFround);
case '|': case '&': case '^': case '<': case '>': // handles <<, >>, >>=, <=, >=
case '=': case '!': { // handles ==, !=
return ASM_INT;
@@ -108,7 +108,7 @@ AsmType detectType(Ref node, AsmData *asmData, bool inVarDef, IString minifiedFr
}
case 's': {
if (node[0] == SEQ) {
- return detectType(node[2], asmData, inVarDef);
+ return detectType(node[2], asmData, inVarDef, minifiedFround);
} else if (node[0] == SUB) {
assert(node[1][0] == NAME);
HeapInfo info = parseHeap(node[1][1]->getCString());
diff --git a/test/min.asm.js b/test/min.asm.js
index 70534990f..d4efa3bca 100644
--- a/test/min.asm.js
+++ b/test/min.asm.js
@@ -1,6 +1,9 @@
-function () {
+function (global, env, buffer) {
"use asm";
+ var c = new global.Int32Array(buffer);
+ var g = new global.Float32Array(buffer);
+
var fr = global.Math.fround;
function floats(f) {
@@ -8,6 +11,12 @@ function () {
var t = fr(0);
return fr(t + f);
}
+ function neg(k, p) {
+ k = k | 0;
+ p = p | 0;
+ var n = fr(0);
+ n = fr(-(c[k >> 2] = p, fr(g[k >> 2])));
+ }
return { floats: floats };
}
diff --git a/test/min.wast b/test/min.wast
index fc67d2505..6a1b5a1f0 100644
--- a/test/min.wast
+++ b/test/min.wast
@@ -8,4 +8,20 @@
(get_local $f)
)
)
+ (func $neg (param $k i32) (param $p i32)
+ (local $n f32)
+ (set_local $n
+ (f32.neg
+ (block
+ (i32.store align=4
+ (get_local $k)
+ (get_local $p)
+ )
+ (f32.load align=4
+ (get_local $k)
+ )
+ )
+ )
+ )
+ )
)