Skip to content

Commit ef6020c

Browse files
authored
wasm2js: optimize loops and eqz (#2051)
1 parent 0994588 commit ef6020c

19 files changed

+188
-213
lines changed

src/wasm2js.h

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -823,9 +823,14 @@ Ref Wasm2JSBuilder::processFunctionBody(Module* m, Function* func, bool standalo
823823
Ref visitLoop(Loop* curr) {
824824
Name asmLabel = curr->name;
825825
continueLabels.insert(asmLabel);
826-
Ref body = blockify(visit(curr->body, result));
827-
flattenAppend(body, ValueBuilder::makeBreak(fromName(asmLabel, NameScope::Label)));
828-
Ref ret = ValueBuilder::makeDo(body, ValueBuilder::makeInt(1));
826+
Ref body = visit(curr->body, result);
827+
// if we can reach the end of the block, we must leave the while (1) loop
828+
if (curr->body->type != unreachable) {
829+
assert(curr->body->type == none); // flat IR
830+
body = blockify(body);
831+
flattenAppend(body, ValueBuilder::makeBreak(fromName(asmLabel, NameScope::Label)));
832+
}
833+
Ref ret = ValueBuilder::makeWhile(ValueBuilder::makeInt(1), body);
829834
return ValueBuilder::makeLabel(fromName(asmLabel, NameScope::Label), ret);
830835
}
831836

@@ -1207,10 +1212,8 @@ Ref Wasm2JSBuilder::processFunctionBody(Module* m, Function* func, bool standalo
12071212
<< std::endl;
12081213
WASM_UNREACHABLE();
12091214
case EqZInt32:
1210-
return ValueBuilder::makeBinary(
1211-
makeAsmCoercion(visit(curr->value,
1212-
EXPRESSION_RESULT), ASM_INT), EQ,
1213-
makeAsmCoercion(ValueBuilder::makeInt(0), ASM_INT));
1215+
// XXX !x does change the type to bool, which is correct, but may be slower?
1216+
return ValueBuilder::makeUnary(L_NOT, visit(curr->value, EXPRESSION_RESULT));
12141217
case ReinterpretFloat32: {
12151218
ABI::wasm2js::ensureScratchMemoryHelpers(module, ABI::wasm2js::SCRATCH_STORE_F32);
12161219
ABI::wasm2js::ensureScratchMemoryHelpers(module, ABI::wasm2js::SCRATCH_LOAD_I32);

test/wasm2js/block.2asm.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ function asmFunc(global, env, buffer) {
6868

6969
function $8() {
7070
dummy();
71-
return (13 | 0) == (0 | 0) | 0;
71+
return !13 | 0;
7272
}
7373

7474
function $9() {

test/wasm2js/br_table_to_loop.2asm.js

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ function asmFunc(global, env, buffer) {
2323
var infinity = global.Infinity;
2424
function $0() {
2525
block : {
26-
loop : do {
26+
loop : while (1) {
2727
switch (1 | 0) {
2828
case 0:
2929
break block;
@@ -32,14 +32,13 @@ function asmFunc(global, env, buffer) {
3232
default:
3333
break block;
3434
};
35-
break loop;
36-
} while (1);
35+
};
3736
}
3837
}
3938

4039
function $1() {
4140
block : {
42-
loop : do {
41+
loop : while (1) {
4342
switch (1 | 0) {
4443
case 0:
4544
continue loop;
@@ -48,8 +47,7 @@ function asmFunc(global, env, buffer) {
4847
default:
4948
continue loop;
5049
};
51-
break loop;
52-
} while (1);
50+
};
5351
}
5452
}
5553

test/wasm2js/call.2asm.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ function asmFunc(global, env, buffer) {
146146
$0$hi = $0$hi | 0;
147147
var i64toi32_i32$5 = 0, i64toi32_i32$2 = 0, i64toi32_i32$0 = 0, $8 = 0, $8$hi = 0, i64toi32_i32$3 = 0, $6 = 0, $6$hi = 0;
148148
i64toi32_i32$0 = $0$hi;
149-
if (($0 | i64toi32_i32$0) == (0 | 0)) {
149+
if (!($0 | i64toi32_i32$0)) {
150150
{
151151
i64toi32_i32$0 = 0;
152152
$8 = 1;
@@ -184,7 +184,7 @@ function asmFunc(global, env, buffer) {
184184
$1$hi = $1$hi | 0;
185185
var i64toi32_i32$5 = 0, i64toi32_i32$2 = 0, i64toi32_i32$0 = 0, $11 = 0, $11$hi = 0, i64toi32_i32$3 = 0, $6 = 0, $6$hi = 0, $9 = 0, $9$hi = 0;
186186
i64toi32_i32$0 = $0$hi;
187-
if (($0 | i64toi32_i32$0) == (0 | 0)) {
187+
if (!($0 | i64toi32_i32$0)) {
188188
{
189189
i64toi32_i32$0 = $1$hi;
190190
$11 = $1;
@@ -286,7 +286,7 @@ function asmFunc(global, env, buffer) {
286286
$0$hi = $0$hi | 0;
287287
var i64toi32_i32$0 = 0, i64toi32_i32$5 = 0, $6 = 0, i64toi32_i32$3 = 0;
288288
i64toi32_i32$0 = $0$hi;
289-
if (($0 | i64toi32_i32$0) == (0 | 0)) {
289+
if (!($0 | i64toi32_i32$0)) {
290290
$6 = 44
291291
} else {
292292
{
@@ -305,7 +305,7 @@ function asmFunc(global, env, buffer) {
305305
$0$hi = $0$hi | 0;
306306
var i64toi32_i32$0 = 0, i64toi32_i32$5 = 0, $6 = 0, i64toi32_i32$3 = 0;
307307
i64toi32_i32$0 = $0$hi;
308-
if (($0 | i64toi32_i32$0) == (0 | 0)) {
308+
if (!($0 | i64toi32_i32$0)) {
309309
$6 = 99
310310
} else {
311311
{

test/wasm2js/call_indirect.2asm.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ function asmFunc(global, env, buffer) {
225225
$0$hi = $0$hi | 0;
226226
var i64toi32_i32$5 = 0, i64toi32_i32$2 = 0, i64toi32_i32$0 = 0, $8 = 0, $8$hi = 0, i64toi32_i32$3 = 0, $6 = 0, $6$hi = 0, wasm2js_i32$0 = 0, wasm2js_i32$1 = 0, wasm2js_i32$2 = 0;
227227
i64toi32_i32$0 = $0$hi;
228-
if (($0 | i64toi32_i32$0) == (0 | 0)) {
228+
if (!($0 | i64toi32_i32$0)) {
229229
{
230230
i64toi32_i32$0 = 0;
231231
$8 = 1;
@@ -319,7 +319,7 @@ function asmFunc(global, env, buffer) {
319319
function even($0) {
320320
$0 = $0 | 0;
321321
var $6 = 0, wasm2js_i32$0 = 0, wasm2js_i32$1 = 0;
322-
if (($0 | 0) == (0 | 0)) {
322+
if (!$0) {
323323
$6 = 44
324324
} else {
325325
$6 = ((wasm2js_i32$1 = $0 - 1 | 0, wasm2js_i32$0 = 15), FUNCTION_TABLE[wasm2js_i32$0](wasm2js_i32$1 | 0) | 0)
@@ -330,7 +330,7 @@ function asmFunc(global, env, buffer) {
330330
function odd($0) {
331331
$0 = $0 | 0;
332332
var $6 = 0, wasm2js_i32$0 = 0, wasm2js_i32$1 = 0;
333-
if (($0 | 0) == (0 | 0)) {
333+
if (!$0) {
334334
$6 = 99
335335
} else {
336336
$6 = ((wasm2js_i32$1 = $0 - 1 | 0, wasm2js_i32$0 = 14), FUNCTION_TABLE[wasm2js_i32$0](wasm2js_i32$1 | 0) | 0)

test/wasm2js/f32.2asm.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ function asmFunc(global, env, buffer) {
124124
var var$1 = Math_fround(0), var$2 = Math_fround(0), wasm2js_f32$0 = Math_fround(0), wasm2js_f32$1 = Math_fround(0), wasm2js_i32$0 = 0;
125125
var$1 = Math_fround(Math_floor(var$0));
126126
var$2 = Math_fround(var$0 - var$1);
127-
if ((var$2 < Math_fround(.5) | 0) == (0 | 0)) {
127+
if (!(var$2 < Math_fround(.5))) {
128128
{
129129
var$0 = Math_fround(Math_ceil(var$0));
130130
if (var$2 > Math_fround(.5)) {

test/wasm2js/f64.2asm.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ function asmFunc(global, env, buffer) {
148148
var var$1 = 0.0, var$2 = 0.0, wasm2js_f64$0 = 0.0, wasm2js_f64$1 = 0.0, wasm2js_i32$0 = 0;
149149
var$1 = Math_floor(var$0);
150150
var$2 = var$0 - var$1;
151-
if ((var$2 < .5 | 0) == (0 | 0)) {
151+
if (!(var$2 < .5)) {
152152
{
153153
var$0 = Math_ceil(var$0);
154154
if (var$2 > .5) {

test/wasm2js/fac.2asm.js

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ function asmFunc(global, env, buffer) {
105105
$2_1 = 1;
106106
$2$hi = i64toi32_i32$0;
107107
block : {
108-
loop_in : do {
108+
loop_in : while (1) {
109109
i64toi32_i32$0 = $1$hi;
110110
i64toi32_i32$2 = $1;
111111
i64toi32_i32$1 = 0;
@@ -133,8 +133,7 @@ function asmFunc(global, env, buffer) {
133133
}
134134
}
135135
continue loop_in;
136-
break loop_in;
137-
} while (1);
136+
};
138137
}
139138
i64toi32_i32$5 = $2$hi;
140139
i64toi32_i32$3 = $2_1;
@@ -153,7 +152,7 @@ function asmFunc(global, env, buffer) {
153152
res = 1;
154153
res$hi = i64toi32_i32$0;
155154
done : {
156-
loop : do {
155+
loop : while (1) {
157156
i64toi32_i32$0 = i$hi;
158157
i64toi32_i32$2 = i;
159158
i64toi32_i32$1 = 0;
@@ -181,8 +180,7 @@ function asmFunc(global, env, buffer) {
181180
}
182181
}
183182
continue loop;
184-
break loop;
185-
} while (1);
183+
};
186184
}
187185
i64toi32_i32$5 = res$hi;
188186
i64toi32_i32$3 = res;
@@ -224,7 +222,7 @@ function asmFunc(global, env, buffer) {
224222
if ($10) {
225223
break block
226224
}
227-
loop_in : do {
225+
loop_in : while (1) {
228226
i64toi32_i32$2 = $1$hi;
229227
i64toi32_i32$2 = $0$hi;
230228
i64toi32_i32$2 = $1$hi;
@@ -270,7 +268,7 @@ function asmFunc(global, env, buffer) {
270268
continue loop_in
271269
}
272270
break loop_in;
273-
} while (1);
271+
};
274272
}
275273
i64toi32_i32$2 = $1$hi;
276274
i64toi32_i32$5 = $1;

test/wasm2js/float_misc.2asm.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,7 @@ function asmFunc(global, env, buffer) {
233233
var var$1 = Math_fround(0), var$2 = Math_fround(0), wasm2js_f32$0 = Math_fround(0), wasm2js_f32$1 = Math_fround(0), wasm2js_i32$0 = 0;
234234
var$1 = Math_fround(Math_floor(var$0));
235235
var$2 = Math_fround(var$0 - var$1);
236-
if ((var$2 < Math_fround(.5) | 0) == (0 | 0)) {
236+
if (!(var$2 < Math_fround(.5))) {
237237
{
238238
var$0 = Math_fround(Math_ceil(var$0));
239239
if (var$2 > Math_fround(.5)) {
@@ -250,7 +250,7 @@ function asmFunc(global, env, buffer) {
250250
var var$1 = 0.0, var$2 = 0.0, wasm2js_f64$0 = 0.0, wasm2js_f64$1 = 0.0, wasm2js_i32$0 = 0;
251251
var$1 = Math_floor(var$0);
252252
var$2 = var$0 - var$1;
253-
if ((var$2 < .5 | 0) == (0 | 0)) {
253+
if (!(var$2 < .5)) {
254254
{
255255
var$0 = Math_ceil(var$0);
256256
if (var$2 > .5) {

test/wasm2js/i32.2asm.js

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ function asmFunc(global, env, buffer) {
128128

129129
function $18(x) {
130130
x = x | 0;
131-
return (x | 0) == (0 | 0) | 0;
131+
return !x | 0;
132132
}
133133

134134
function $19(x, y) {
@@ -201,16 +201,15 @@ function asmFunc(global, env, buffer) {
201201
function __wasm_popcnt_i32(var$0) {
202202
var var$1 = 0, $5_1 = 0;
203203
label$1 : {
204-
label$2 : do {
204+
label$2 : while (1) {
205205
$5_1 = var$1;
206-
if ((var$0 | 0) == (0 | 0)) {
206+
if (!var$0) {
207207
break label$1
208208
}
209209
var$0 = var$0 & var$0 - 1;
210210
var$1 = var$1 + 1 | 0;
211211
continue label$2;
212-
break label$2;
213-
} while (1);
212+
};
214213
}
215214
return $5_1;
216215
}

0 commit comments

Comments
 (0)