aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2013-06-05 18:37:01 -0700
committerAlon Zakai <alonzakai@gmail.com>2013-06-05 19:01:10 -0700
commit24807a6d8f657b27e0ae6b73e73fa987a0672480 (patch)
tree778bdee6fa5d25d1390bd291a777fa7ac79ea93e
parent0e4a1c01e3f09751c72c57bf9e8bddfc5581bd53 (diff)
simplify infinite while loops with a break at the end into a do-while with a condition
-rw-r--r--tools/js-optimizer.js16
-rw-r--r--tools/test-js-optimizer-regs-output.js5
-rw-r--r--tools/test-js-optimizer-regs.js10
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"]