diff options
author | Alon Zakai <alonzakai@gmail.com> | 2014-02-04 11:54:12 -0500 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2014-02-04 11:54:12 -0500 |
commit | 71c8f19c6e63539565641b5d992ba69d27e55475 (patch) | |
tree | 6c6bad04664f37ae8e938285e61090f2d9780d65 | |
parent | 3136112a0000d94024851347b3fc03e178481add (diff) |
do not apply de-morgan's laws on floats, nans break them
-rw-r--r-- | tools/js-optimizer.js | 4 | ||||
-rw-r--r-- | tools/test-js-optimizer-asm-last-output.js | 2 | ||||
-rw-r--r-- | tools/test-js-optimizer-asm-pre-output.js | 9 | ||||
-rw-r--r-- | tools/test-js-optimizer-asm-pre.js | 12 |
4 files changed, 24 insertions, 3 deletions
diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 905e80fc..6724e77f 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -1143,7 +1143,9 @@ function optimizeShiftsAggressive(ast) { // or such. Simplifying these saves space and time. function simplifyNotCompsDirect(node) { if (node[0] === 'unary-prefix' && node[1] === '!') { - if (node[2][0] === 'binary') { + // de-morgan's laws do not work on floats, due to nans >:( + if (node[2][0] === 'binary' && (!asm || (((node[2][2][0] === 'binary' && node[2][2][1] === '|') || node[2][2][0] === 'num') && + ((node[2][3][0] === 'binary' && node[2][3][1] === '|') || node[2][3][0] === 'num')))) { switch(node[2][1]) { case '<': return ['binary', '>=', node[2][2], node[2][3]]; case '>': return ['binary', '<=', node[2][2], node[2][3]]; diff --git a/tools/test-js-optimizer-asm-last-output.js b/tools/test-js-optimizer-asm-last-output.js index f850b18f..1b9ac585 100644 --- a/tools/test-js-optimizer-asm-last-output.js +++ b/tools/test-js-optimizer-asm-last-output.js @@ -39,7 +39,7 @@ function looop() { } while (!condition()); do { do_it(); - } while (a <= b); + } while (!(a > b)); do { do_it(); } while (x()); diff --git a/tools/test-js-optimizer-asm-pre-output.js b/tools/test-js-optimizer-asm-pre-output.js index 63d93cd5..c9746e78 100644 --- a/tools/test-js-optimizer-asm-pre-output.js +++ b/tools/test-js-optimizer-asm-pre-output.js @@ -529,4 +529,13 @@ function badf2() { $9 = +$8; HEAPF32[$gep23_asptr >> 2] = $9; } +function fcomp() { + if (!($y < $x)) return 5; + if (!(5 < $x)) return 5; + if (!($y < 5)) return 5; + if (($a | 0) >= ($b | 0)) return 5; + if (($a | 0) >= 5) return 5; + if (5 >= ($b | 0)) return 5; + if (5 >= 5) return 5; +} diff --git a/tools/test-js-optimizer-asm-pre.js b/tools/test-js-optimizer-asm-pre.js index 83b472d9..00ebd7d7 100644 --- a/tools/test-js-optimizer-asm-pre.js +++ b/tools/test-js-optimizer-asm-pre.js @@ -540,4 +540,14 @@ function badf2() { $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"] +function fcomp() { + // de-morgan's laws are not valid on floats, due to NaNs >:( + if (!($y < $x)) return 5; + if (!(5 < $x)) return 5; + if (!($y < 5)) return 5; + if (!(($a|0) < ($b|0))) return 5; + if (!(($a|0) < 5)) return 5; + if (!(5 < ($b|0))) return 5; + if (!(5 < 5)) return 5; +} +// EMSCRIPTEN_GENERATED_FUNCTIONS: ["a", "b", "rett", "ret2t", "retf", "i32_8", "tempDoublePtr", "boxx", "_main", "badf", "badf2", "fcomp"] |