From f041b9caa4998f46c98f8da5494c3f8135a9b8e8 Mon Sep 17 00:00:00 2001 From: Aidan Hobson Sayers Date: Fri, 17 Mar 2017 19:37:55 +0000 Subject: [PATCH 1/2] Explicitly recognise asm_float_zero --- tools/js-optimizer.js | 1 + tools/optimizer/optimizer-shared.cpp | 1 + 2 files changed, 2 insertions(+) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 4a04e7333e35d..5f7537bf0d8f0 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -1848,6 +1848,7 @@ function detectType(node, asmInfo, inVarDef) { if (ret !== ASM_NONE) return ret; } if (!inVarDef) { + if (ASM_FLOAT_ZERO && ASM_FLOAT_ZERO === node[1]) return ASM_FLOAT; switch (node[1]) { case 'inf': case 'nan': return ASM_DOUBLE; // TODO: when minified case 'tempRet0': return ASM_INT; diff --git a/tools/optimizer/optimizer-shared.cpp b/tools/optimizer/optimizer-shared.cpp index 0194f4fcda1d4..0b30dc4bb5606 100644 --- a/tools/optimizer/optimizer-shared.cpp +++ b/tools/optimizer/optimizer-shared.cpp @@ -58,6 +58,7 @@ AsmType detectType(Ref node, AsmData *asmData, bool inVarDef) { if (ret != ASM_NONE) return ret; } if (!inVarDef) { + if (!ASM_FLOAT_ZERO.isNull() && node[1] == ASM_FLOAT_ZERO) return ASM_FLOAT; if (node[1] == INF || node[1] == NaN) return ASM_DOUBLE; if (node[1] == TEMP_RET0) return ASM_INT; return ASM_NONE; From 9017aaa761a8dfdf2e0038919d6a050dd1aaa4c6 Mon Sep 17 00:00:00 2001 From: Aidan Hobson Sayers Date: Thu, 6 Apr 2017 20:37:18 +0100 Subject: [PATCH 2/2] Add some tests --- ...-no-reduce-dead-float-return-to-nothing-output.js | 11 +++++++++++ .../test-no-reduce-dead-float-return-to-nothing.js | 12 ++++++++++++ .../test-reduce-dead-float-return-output.js | 11 +++++++++++ tests/optimizer/test-reduce-dead-float-return.js | 12 ++++++++++++ tests/test_other.py | 4 ++++ 5 files changed, 50 insertions(+) create mode 100644 tests/optimizer/test-no-reduce-dead-float-return-to-nothing-output.js create mode 100644 tests/optimizer/test-no-reduce-dead-float-return-to-nothing.js create mode 100644 tests/optimizer/test-reduce-dead-float-return-output.js create mode 100644 tests/optimizer/test-reduce-dead-float-return.js diff --git a/tests/optimizer/test-no-reduce-dead-float-return-to-nothing-output.js b/tests/optimizer/test-no-reduce-dead-float-return-to-nothing-output.js new file mode 100644 index 0000000000000..930ec74717c63 --- /dev/null +++ b/tests/optimizer/test-no-reduce-dead-float-return-to-nothing-output.js @@ -0,0 +1,11 @@ +function test() { + var f1 = f0; + if (HEAPF32[(0 | 0) >> 2] <= HEAPF32[(1 | 0) >> 2]) { + f1 = Math_fround(+1); + return Math_fround(f1); + } else { + f1 = Math_fround(+2); + return Math_fround(f1); + } + return f0; +} diff --git a/tests/optimizer/test-no-reduce-dead-float-return-to-nothing.js b/tests/optimizer/test-no-reduce-dead-float-return-to-nothing.js new file mode 100644 index 0000000000000..4ac988a138275 --- /dev/null +++ b/tests/optimizer/test-no-reduce-dead-float-return-to-nothing.js @@ -0,0 +1,12 @@ +function test() { + var f1 = f0; + if (HEAPF32[(0 | 0) >> 2] <= HEAPF32[(1 | 0) >> 2]) { + f1 = Math_fround(+1); + return Math_fround(f1); + } else { + f1 = Math_fround(+2); + return Math_fround(f1); + } + return f0; +} +// EMSCRIPTEN_GENERATED_FUNCTIONS: ["test"] diff --git a/tests/optimizer/test-reduce-dead-float-return-output.js b/tests/optimizer/test-reduce-dead-float-return-output.js new file mode 100644 index 0000000000000..930ec74717c63 --- /dev/null +++ b/tests/optimizer/test-reduce-dead-float-return-output.js @@ -0,0 +1,11 @@ +function test() { + var f1 = f0; + if (HEAPF32[(0 | 0) >> 2] <= HEAPF32[(1 | 0) >> 2]) { + f1 = Math_fround(+1); + return Math_fround(f1); + } else { + f1 = Math_fround(+2); + return Math_fround(f1); + } + return f0; +} diff --git a/tests/optimizer/test-reduce-dead-float-return.js b/tests/optimizer/test-reduce-dead-float-return.js new file mode 100644 index 0000000000000..fbde2926e018b --- /dev/null +++ b/tests/optimizer/test-reduce-dead-float-return.js @@ -0,0 +1,12 @@ +function test() { + var $x = Math_fround(0); + if (HEAPF32[(0|0)>>2] <= HEAPF32[(1|0)>>2]) { + $x = Math_fround(+1); + return (Math_fround($x)); + } else { + $x = Math_fround(+2); + return (Math_fround($x)); + } + return Math_fround((Math_fround(+0))); +} +// EMSCRIPTEN_GENERATED_FUNCTIONS: ["test"] diff --git a/tests/test_other.py b/tests/test_other.py index 5638439386229..bfa1047f0bbcf 100644 --- a/tests/test_other.py +++ b/tests/test_other.py @@ -2035,6 +2035,10 @@ def test_js_optimizer(self): ['asm', 'asmPreciseF32', 'simplifyExpressions', 'optimizeFrounds']), (path_from_root('tests', 'optimizer', 'test-js-optimizer-asm-pre-f32.js'), open(path_from_root('tests', 'optimizer', 'test-js-optimizer-asm-pre-output-f32-nosimp.js')).read(), ['asm', 'asmPreciseF32', 'optimizeFrounds']), + (path_from_root('tests', 'optimizer', 'test-reduce-dead-float-return.js'), open(path_from_root('tests', 'optimizer', 'test-reduce-dead-float-return-output.js')).read(), + ['asm', 'optimizeFrounds', 'registerizeHarder']), + (path_from_root('tests', 'optimizer', 'test-no-reduce-dead-float-return-to-nothing.js'), open(path_from_root('tests', 'optimizer', 'test-no-reduce-dead-float-return-to-nothing-output.js')).read(), + ['asm', 'registerizeHarder']), (path_from_root('tests', 'optimizer', 'test-js-optimizer-asm-last.js'), [open(path_from_root('tests', 'optimizer', 'test-js-optimizer-asm-lastOpts-output.js')).read(), open(path_from_root('tests', 'optimizer', 'test-js-optimizer-asm-lastOpts-output2.js')).read(), open(path_from_root('tests', 'optimizer', 'test-js-optimizer-asm-lastOpts-output3.js')).read()], ['asm', 'asmLastOpts']), (path_from_root('tests', 'optimizer', 'asmLastOpts.js'), open(path_from_root('tests', 'optimizer', 'asmLastOpts-output.js')).read(),