Skip to content

Commit 909ac34

Browse files
authored
wasm2js: avoid some slow operations when not optimizing (#2082)
Without this PR, wasm2js0.test_printf in emscripten took an extremely long time to compile.
1 parent 80b509c commit 909ac34

20 files changed

Lines changed: 4087 additions & 3751 deletions

src/wasm2js.h

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -301,12 +301,14 @@ Ref Wasm2JSBuilder::processWasm(Module* wasm, Name funcName) {
301301
// Finally, get the code into the flat form we need for wasm2js itself, and
302302
// optimize that a little in a way that keeps flat property.
303303
runner.add("flatten");
304-
runner.add("remove-unused-names");
305-
runner.add("merge-blocks");
304+
// Regardless of optimization level, run some simple optimizations to undo
305+
// some of the effects of flattening.
306306
runner.add("simplify-locals-notee-nostructure");
307-
// Coalescing is slow if we didn't run full optimizations earlier, so don't
308-
// run it automatically.
307+
// Some operations can be very slow if we didn't run full optimizations
308+
// earlier, so don't run them automatically.
309309
if (options.optimizeLevel > 0) {
310+
runner.add("remove-unused-names");
311+
runner.add("merge-blocks");
310312
runner.add("coalesce-locals");
311313
}
312314
runner.add("reorder-locals");

test/wasm2js/block.2asm.js

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -34,19 +34,25 @@ function asmFunc(global, env, buffer) {
3434
}
3535

3636
function $3() {
37-
dummy();
38-
dummy();
39-
dummy();
40-
dummy();
41-
dummy();
42-
dummy();
43-
dummy();
37+
block : {
38+
dummy();
39+
dummy();
40+
dummy();
41+
dummy();
42+
}
43+
block1 : {
44+
dummy();
45+
dummy();
46+
dummy();
47+
}
4448
return 8 | 0;
4549
}
4650

4751
function $4() {
48-
dummy();
49-
dummy();
52+
block : {
53+
dummy();
54+
dummy();
55+
}
5056
return 9 | 0;
5157
}
5258

@@ -125,14 +131,13 @@ function asmFunc(global, env, buffer) {
125131
$0 = 0;
126132
$1_1 = $0;
127133
block : {
128-
$2_1 = 1;
129-
break block;
134+
block47 : {
135+
$2_1 = 1;
136+
break block;
137+
}
130138
}
131139
$0 = $1_1 + $2_1 | 0;
132140
$5_1 = $0;
133-
block49 : {
134-
break block49;
135-
}
136141
$0 = $5_1 + 2 | 0;
137142
$9_1 = $0;
138143
block50 : {
@@ -142,8 +147,10 @@ function asmFunc(global, env, buffer) {
142147
$0 = $9_1 + $10_1 | 0;
143148
$13_1 = $0;
144149
block51 : {
145-
$14_1 = 8;
146-
break block51;
150+
block52 : {
151+
$14_1 = 8;
152+
break block51;
153+
}
147154
}
148155
$0 = $13_1 + $14_1 | 0;
149156
return $0 | 0;

test/wasm2js/br.2asm.js

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -115,28 +115,34 @@ function asmFunc(global, env, buffer) {
115115
function $13() {
116116
var $0 = 0, $1_1 = 0, $3_1 = 0;
117117
block : {
118-
$0 = 3;
119-
break block;
118+
loop_in : while (1) {
119+
$0 = 3;
120+
break block;
121+
};
120122
}
121123
return $0 | 0;
122124
}
123125

124126
function $14() {
125127
var $0 = 0, $1_1 = 0, $3_1 = 0;
126128
block : {
127-
dummy();
128-
$0 = 4;
129-
break block;
129+
loop_in : while (1) {
130+
dummy();
131+
$0 = 4;
132+
break block;
133+
};
130134
}
131135
return $0 | 0;
132136
}
133137

134138
function $15() {
135139
var $0 = 0;
136140
block : {
137-
dummy();
138-
$0 = 5;
139-
break block;
141+
loop_in : while (1) {
142+
dummy();
143+
$0 = 5;
144+
break block;
145+
};
140146
}
141147
return $0 | 0;
142148
}
@@ -505,8 +511,10 @@ function asmFunc(global, env, buffer) {
505511
function $54() {
506512
var $0 = 0;
507513
block : {
508-
$0 = 8;
509-
break block;
514+
block0 : {
515+
$0 = 8;
516+
break block;
517+
}
510518
}
511519
return 1 + $0 | 0 | 0;
512520
}

test/wasm2js/br_if.2asm.js

Lines changed: 55 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,9 @@ function asmFunc(global, env, buffer) {
5050

5151
function $3($0) {
5252
$0 = $0 | 0;
53-
dummy();
54-
dummy();
5553
block : {
54+
dummy();
55+
dummy();
5656
if ($0) {
5757
break block
5858
}
@@ -89,10 +89,10 @@ function asmFunc(global, env, buffer) {
8989
function $6($0) {
9090
$0 = $0 | 0;
9191
var $2_1 = 0;
92-
dummy();
93-
dummy();
94-
$2_1 = 11;
9592
block : {
93+
dummy();
94+
dummy();
95+
$2_1 = 11;
9696
if ($0) {
9797
break block
9898
}
@@ -103,33 +103,40 @@ function asmFunc(global, env, buffer) {
103103
function $7($0) {
104104
$0 = $0 | 0;
105105
block : {
106-
if ($0) {
107-
break block
108-
}
109-
return 2 | 0;
106+
loop_in : while (1) {
107+
if ($0) {
108+
break block
109+
}
110+
return 2 | 0;
111+
};
110112
}
111113
return 3 | 0;
112114
}
113115

114116
function $8($0) {
115117
$0 = $0 | 0;
116118
block : {
117-
dummy();
118-
if ($0) {
119-
break block
120-
}
121-
return 2 | 0;
119+
loop_in : while (1) {
120+
dummy();
121+
if ($0) {
122+
break block
123+
}
124+
return 2 | 0;
125+
};
122126
}
123127
return 4 | 0;
124128
}
125129

126130
function $9($0) {
127131
$0 = $0 | 0;
128-
dummy();
129132
fake_return_waka123 : {
130-
if ($0) {
131-
break fake_return_waka123
132-
}
133+
loop_in : while (1) {
134+
dummy();
135+
if ($0) {
136+
break fake_return_waka123
137+
}
138+
break loop_in;
139+
};
133140
}
134141
}
135142

@@ -164,10 +171,12 @@ function asmFunc(global, env, buffer) {
164171
function $12($0) {
165172
$0 = $0 | 0;
166173
var $2_1 = 0;
167-
$2_1 = 8;
168174
block : {
169-
if ($0) {
170-
break block
175+
block0 : {
176+
$2_1 = 8;
177+
if ($0) {
178+
break block
179+
}
171180
}
172181
$2_1 = 4 + 16 | 0;
173182
}
@@ -178,9 +187,11 @@ function asmFunc(global, env, buffer) {
178187
$0 = $0 | 0;
179188
var $2_1 = 0;
180189
block : {
181-
$2_1 = 8;
182-
if ($0) {
183-
break block
190+
block1 : {
191+
$2_1 = 8;
192+
if ($0) {
193+
break block
194+
}
184195
}
185196
$2_1 = 4;
186197
break block;
@@ -191,10 +202,12 @@ function asmFunc(global, env, buffer) {
191202
function $14($0) {
192203
$0 = $0 | 0;
193204
var $2_1 = 0;
194-
$2_1 = 8;
195205
block : {
196-
if ($0) {
197-
break block
206+
block2 : {
207+
$2_1 = 8;
208+
if ($0) {
209+
break block
210+
}
198211
}
199212
$2_1 = 4;
200213
if (1) {
@@ -208,10 +221,12 @@ function asmFunc(global, env, buffer) {
208221
function $15($0) {
209222
$0 = $0 | 0;
210223
var $2_1 = 0;
211-
$2_1 = 8;
212224
block : {
213-
if ($0) {
214-
break block
225+
block3 : {
226+
$2_1 = 8;
227+
if ($0) {
228+
break block
229+
}
215230
}
216231
$2_1 = 4;
217232
if (1) {
@@ -226,9 +241,11 @@ function asmFunc(global, env, buffer) {
226241
$0 = $0 | 0;
227242
var $2_1 = 0;
228243
block : {
229-
$2_1 = 8;
230-
if ($0) {
231-
break block
244+
block4 : {
245+
$2_1 = 8;
246+
if ($0) {
247+
break block
248+
}
232249
}
233250
$2_1 = 4;
234251
switch (1 | 0) {
@@ -243,9 +260,11 @@ function asmFunc(global, env, buffer) {
243260
$0 = $0 | 0;
244261
var $2_1 = 0;
245262
block : {
246-
$2_1 = 8;
247-
if ($0) {
248-
break block
263+
block5 : {
264+
$2_1 = 8;
265+
if ($0) {
266+
break block
267+
}
249268
}
250269
$2_1 = 4;
251270
switch (1 | 0) {

test/wasm2js/br_table.2asm.js

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -98,12 +98,6 @@ function asmFunc(global, env, buffer) {
9898

9999
function $9($0) {
100100
$0 = $0 | 0;
101-
block : {
102-
switch ($0 | 0) {
103-
default:
104-
break block;
105-
};
106-
}
107101
return 22 | 0;
108102
}
109103

@@ -12593,10 +12587,12 @@ function asmFunc(global, env, buffer) {
1259312587
function $20() {
1259412588
var $1_1 = 0, $2_1 = 0, $4_1 = 0;
1259512589
fake_return_waka123 : {
12596-
$1_1 = 3;
12597-
switch (0 | 0) {
12598-
default:
12599-
break fake_return_waka123;
12590+
loop_in : while (1) {
12591+
$1_1 = 3;
12592+
switch (0 | 0) {
12593+
default:
12594+
break fake_return_waka123;
12595+
};
1260012596
};
1260112597
}
1260212598
return $1_1 | 0;
@@ -12605,11 +12601,13 @@ function asmFunc(global, env, buffer) {
1260512601
function $21() {
1260612602
var $1_1 = 0, $2_1 = 0, $4_1 = 0;
1260712603
fake_return_waka123 : {
12608-
dummy();
12609-
$1_1 = 4;
12610-
switch (-1 | 0) {
12611-
default:
12612-
break fake_return_waka123;
12604+
loop_in : while (1) {
12605+
dummy();
12606+
$1_1 = 4;
12607+
switch (-1 | 0) {
12608+
default:
12609+
break fake_return_waka123;
12610+
};
1261312611
};
1261412612
}
1261512613
return $1_1 | 0;
@@ -12618,11 +12616,13 @@ function asmFunc(global, env, buffer) {
1261812616
function $22() {
1261912617
var $1_1 = 0;
1262012618
fake_return_waka123 : {
12621-
dummy();
12622-
$1_1 = 5;
12623-
switch (1 | 0) {
12624-
default:
12625-
break fake_return_waka123;
12619+
loop_in : while (1) {
12620+
dummy();
12621+
$1_1 = 5;
12622+
switch (1 | 0) {
12623+
default:
12624+
break fake_return_waka123;
12625+
};
1262612626
};
1262712627
}
1262812628
return $1_1 | 0;

0 commit comments

Comments
 (0)