diff options
-rw-r--r-- | tools/js-optimizer.js | 16 | ||||
-rw-r--r-- | tools/test-js-optimizer-regs-output.js | 5 | ||||
-rw-r--r-- | tools/test-js-optimizer-regs.js | 10 |
3 files changed, 30 insertions, 1 deletions
diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 09791150..57c9cf79 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -968,6 +968,7 @@ function simplifyNotComps(ast) { } } }); + return ast; } function simplifyExpressionsPost(ast) { @@ -1804,6 +1805,21 @@ function registerize(ast) { } denormalizeAsm(fun, finalAsmData); } + + // Post-registerize optimizations. This is near the end of the pipeline, we can assume all other optimizations except for minification are done + traverse(fun, function(node, type) { + if (type == 'while' && node[1][0] == 'num' && node[1][1] == 1 && node[2][0] == 'block') { + // while (1) { .. if (..) { break } } ==> do { .. } while(..) + var stats = node[2][1]; + var last = stats[stats.length-1]; + if (last[0] == 'if' && !last[3] && last[2][0] == 'block' && last[2][1][0][0] == 'break' && !last[2][1][0][1]) { + var conditionToBreak = last[1]; + stats.pop(); + node[0] = 'do'; + node[1] = simplifyNotComps(['unary-prefix', '!', conditionToBreak]); + } + } + }); }); } diff --git a/tools/test-js-optimizer-regs-output.js b/tools/test-js-optimizer-regs-output.js index fe7de5fb..c1c9ec87 100644 --- a/tools/test-js-optimizer-regs-output.js +++ b/tools/test-js-optimizer-regs-output.js @@ -229,4 +229,9 @@ function __ZN14NetworkAddressC1EPKcti(r1) { __ZN14NetworkAddressC2EPKcti(r1); return; } +function looop() { + do { + do_it(); + } while (!condition()); +} diff --git a/tools/test-js-optimizer-regs.js b/tools/test-js-optimizer-regs.js index 3013e518..b38760cc 100644 --- a/tools/test-js-optimizer-regs.js +++ b/tools/test-js-optimizer-regs.js @@ -234,4 +234,12 @@ function __ZN14NetworkAddressC1EPKcti($this) { __ZN14NetworkAddressC2EPKcti($this); return; } -// EMSCRIPTEN_GENERATED_FUNCTIONS: ["test", "primes", "atomic", "fcntl_open", "ex", "switchey", "__ZN14NetworkAddressC1EPKcti"] +function looop() { + while (1) { + do_it(); + if (condition()) { + break; + } + } +} +// EMSCRIPTEN_GENERATED_FUNCTIONS: ["test", "primes", "atomic", "fcntl_open", "ex", "switchey", "__ZN14NetworkAddressC1EPKcti", "looop"] |