diff options
author | Alon Zakai <alonzakai@gmail.com> | 2014-02-03 22:12:41 -0500 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2014-02-03 22:12:41 -0500 |
commit | b6782ad900f6f4487aba973fbd04e8e232a33e79 (patch) | |
tree | 8fa139ae83616aef6ac9105598e6a1c207210f1d /tools | |
parent | 9ce41213fd7c3978952cf8beae785e7ce0e7064d (diff) |
handle fround in optimizing out of tempDoublePtr
Diffstat (limited to 'tools')
-rw-r--r-- | tools/js-optimizer.js | 13 | ||||
-rw-r--r-- | tools/test-js-optimizer-asm-pre-output.js | 10 | ||||
-rw-r--r-- | tools/test-js-optimizer-asm-pre.js | 12 |
3 files changed, 32 insertions, 3 deletions
diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 21d521fd..2ae3ce47 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -709,6 +709,10 @@ function simplifyExpressions(ast) { } } }); + var hasFloat = false; + for (var v in asmData.vars) { + if (asmData.vars[v] === ASM_FLOAT) hasFloat = true; + } for (var v in bitcastVars) { var info = bitcastVars[v]; // good variables define only one type, use only one type, have definitions and uses, and define as a different type than they use @@ -729,7 +733,12 @@ function simplifyExpressions(ast) { info.uses.forEach(function(use) { use[2][1][1] = correct; }); - asmData.vars[v] = 1 - asmData.vars[v]; + var correctType; + switch(asmData.vars[v]) { + case ASM_INT: correctType = hasFloat ? ASM_FLOAT : ASM_DOUBLE; break; + case ASM_FLOAT: case ASM_DOUBLE: correctType = ASM_INT; break; + } + asmData.vars[v] = correctType; } } denormalizeAsm(ast, asmData); @@ -1577,7 +1586,7 @@ function makeAsmVarDef(v, type) { case ASM_INT: return [v, ['num', 0]]; case ASM_DOUBLE: return [v, ['unary-prefix', '+', ['num', 0]]]; case ASM_FLOAT: return [v, ['call', ['name', 'Math_fround'], [['num', 0]]]]; - default: throw 'wha?'; + default: throw 'wha? ' + JSON.stringify([node, type]) + new Error().stack; } } diff --git a/tools/test-js-optimizer-asm-pre-output.js b/tools/test-js-optimizer-asm-pre-output.js index 0fa81050..63d93cd5 100644 --- a/tools/test-js-optimizer-asm-pre-output.js +++ b/tools/test-js-optimizer-asm-pre-output.js @@ -519,4 +519,14 @@ function _main($argc, $argv) { STACKTOP = __stackBase__; return $_0 | 0; } +function badf() { + var $9 = 0; + $9 = $8 | 0; + HEAP32[$gep23_asptr >> 2] = $9; +} +function badf2() { + var $9 = +0; + $9 = +$8; + HEAPF32[$gep23_asptr >> 2] = $9; +} diff --git a/tools/test-js-optimizer-asm-pre.js b/tools/test-js-optimizer-asm-pre.js index dadeef53..83b472d9 100644 --- a/tools/test-js-optimizer-asm-pre.js +++ b/tools/test-js-optimizer-asm-pre.js @@ -530,4 +530,14 @@ function _main($argc, $argv) { STACKTOP = __stackBase__; return $_0 | 0; } -// EMSCRIPTEN_GENERATED_FUNCTIONS: ["a", "b", "rett", "ret2t", "retf", "i32_8", "tempDoublePtr", "boxx", "_main"] +function badf() { + var $9 = Math_fround(0); + $9 = (HEAP32[tempDoublePtr>>2]=$8,Math_fround(HEAPF32[tempDoublePtr>>2])); + HEAPF32[$gep23_asptr>>2] = $9; +} +function badf2() { + var $9 = 0; + $9 = (HEAPF32[tempDoublePtr>>2]=$8,HEAP32[tempDoublePtr>>2]|0); + HEAP32[$gep23_asptr>>2] = $9; +} +// EMSCRIPTEN_GENERATED_FUNCTIONS: ["a", "b", "rett", "ret2t", "retf", "i32_8", "tempDoublePtr", "boxx", "_main", "badf", "badf2"] |