diff options
author | Alon Zakai <alonzakai@gmail.com> | 2015-11-22 10:34:50 -0800 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2015-11-22 10:35:32 -0800 |
commit | ac1d0f855f3fde65753aeea546c6781dbfd331ba (patch) | |
tree | cb67da35b95df91b7b14e5a55cda73605ec0aeee | |
parent | f9764009d8df47eeddf9e542705bb6a5e7d397b0 (diff) | |
download | binaryen-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.cpp | 8 | ||||
-rw-r--r-- | test/min.asm.js | 11 | ||||
-rw-r--r-- | test/min.wast | 16 |
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) + ) + ) + ) + ) + ) ) |