From 4b223a33d9f44b99a783cb63329facea7edfb783 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 28 May 2019 10:58:14 -0700 Subject: wasm2js: Switch optimizations (#2141) This pattern-matches towers of blocks + a br_table into a JS switch. This is much smaller in code size and also avoids heavy nesting that can exceed the recursion limits of JS parsers. This is not enough yet, because it pattern-matches very specifically. In reality, switches can look slightly different. Followup PRs will extend this. For now, this passes the test suite (what passed before - not including the massive-switch tests) + fuzzing so it's a good start. --- test/wasm2js/labels.2asm.js | 89 +++++++++++++++++++-------------------------- 1 file changed, 37 insertions(+), 52 deletions(-) (limited to 'test/wasm2js/labels.2asm.js') diff --git a/test/wasm2js/labels.2asm.js b/test/wasm2js/labels.2asm.js index c4a93491c..fa0bd0a22 100644 --- a/test/wasm2js/labels.2asm.js +++ b/test/wasm2js/labels.2asm.js @@ -167,54 +167,39 @@ function asmFunc(global, env, buffer) { function $8($0_1) { $0_1 = $0_1 | 0; - var $2_2 = 0, $3_2 = 0; + var $2_1 = 0, $3_1 = 0; ret : { exit : { $0_2 : { - default_ : { - $3_1 : { - $2_1 : { - $1_1 : { - switch ($0_1 | 0) { - case 0: - break $0_2; - case 1: - break $1_1; - case 2: - break $2_1; - case 3: - break $3_1; - default: - break default_; - }; - } - } - $2_2 = 2; - break exit; - } - $3_2 = 3; + switch ($0_1 | 0) { + case 1: + case 2: + $2_1 = 2; + break exit; + case 3: + $3_1 = 3; break ret; - } + default: + case 0: + break $0_2; + }; } - $2_2 = 5; + $2_1 = 5; } - $3_2 = Math_imul(10, $2_2); + $3_1 = Math_imul(10, $2_1); } - return $3_2 | 0; + return $3_1 | 0; } function $9($0_1) { $0_1 = $0_1 | 0; $1_1 : { - $0_2 : { - switch ($0_1 | 0) { - case 0: - break $0_2; - default: - break $1_1; - }; - } - return 0 | 0; + switch ($0_1 | 0) { + case 0: + return 0 | 0; + default: + break $1_1; + }; } return 2 | 0; } @@ -251,41 +236,41 @@ function asmFunc(global, env, buffer) { } function $11() { - var $2_2 = 0, $0_1 = 0; + var $2_1 = 0, $0_1 = 0; l0 : { l1 : { $0_1 = 1; break l1; } - $2_2 = $0_1; + $2_1 = $0_1; if (1) { break l0 } - $2_2 = 1; + $2_1 = 1; } - return $2_2 | 0; + return $2_1 | 0; } function $12() { - var $2_2 = 0, $0_1 = 0; + var $2_1 = 0, $0_1 = 0; l0 : { l1 : { $0_1 = 1; break l1; } - $2_2 = $0_1; + $2_1 = $0_1; break l0; } - return $2_2 | 0; + return $2_1 | 0; } function $13() { - var i1 = 0, $7_1 = 0, $3_2 = 0; + var i1 = 0, $7_1 = 0, $3_1 = 0; l0 : { i1 = 1; - $3_2 = i1; + $3_1 = i1; i1 = 2; - $7_1 = $3_2; + $7_1 = $3_1; if (i1) { break l0 } @@ -295,16 +280,16 @@ function asmFunc(global, env, buffer) { } function $14() { - var $2_2 = 0, $0_1 = 0, $3_2 = 0; + var $2_1 = 0, $0_1 = 0, $3_1 = 0; l0 : { l1 : { $0_1 = 1; break l1; } - $2_2 = $0_1; + $2_1 = $0_1; break l0; } - return $2_2 | 0; + return $2_1 | 0; } function $15() { @@ -317,15 +302,15 @@ function asmFunc(global, env, buffer) { } function $16() { - var $1_2 = 0, $2_2 = 0; + var $1_2 = 0, $2_1 = 0; l1 : { $1_2 = 2; l113 : { - $2_2 = 3; + $2_1 = 3; break l113; } } - return $1_2 + $2_2 | 0 | 0; + return $1_2 + $2_1 | 0 | 0; } var FUNCTION_TABLE = []; -- cgit v1.2.3