Skip to content

Commit 0dab885

Browse files
authored
DCE at the end of wasm2js (#2574)
By doing so we ensure that our calls to convert wasm types to JS types never try to convert an unreachable. Fixes #2558
1 parent 44c3c2d commit 0dab885

File tree

8 files changed

+265
-69
lines changed

8 files changed

+265
-69
lines changed

src/wasm2js.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -329,6 +329,9 @@ Ref Wasm2JSBuilder::processWasm(Module* wasm, Name funcName) {
329329
runner.add("reorder-locals");
330330
runner.add("vacuum");
331331
runner.add("remove-unused-module-elements");
332+
// DCE at the end to make sure all IR nodes have valid types for conversion
333+
// to JS, and not unreachable.
334+
runner.add("dce");
332335
runner.setDebug(flags.debug);
333336
runner.run();
334337
}

test/wasm2js/br.2asm.js

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -114,34 +114,28 @@ function asmFunc(global, env, buffer) {
114114
function $13() {
115115
var $0 = 0, $1_1 = 0, $3_1 = 0;
116116
block : {
117-
loop_in : while (1) {
118-
$0 = 3;
119-
break block;
120-
};
117+
$0 = 3;
118+
break block;
121119
}
122120
return $0 | 0;
123121
}
124122

125123
function $14() {
126124
var $0 = 0, $1_1 = 0, $3_1 = 0;
127125
block : {
128-
loop_in : while (1) {
129-
dummy();
130-
$0 = 4;
131-
break block;
132-
};
126+
dummy();
127+
$0 = 4;
128+
break block;
133129
}
134130
return $0 | 0;
135131
}
136132

137133
function $15() {
138134
var $0 = 0;
139135
block : {
140-
loop_in : while (1) {
141-
dummy();
142-
$0 = 5;
143-
break block;
144-
};
136+
dummy();
137+
$0 = 5;
138+
break block;
145139
}
146140
return $0 | 0;
147141
}

test/wasm2js/br_table.2asm.js

Lines changed: 14 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -12568,12 +12568,10 @@ function asmFunc(global, env, buffer) {
1256812568
function $20() {
1256912569
var $1_1 = 0, $2_1 = 0, $4_1 = 0;
1257012570
fake_return_waka123 : {
12571-
loop_in : while (1) {
12572-
$1_1 = 3;
12573-
switch (0 | 0) {
12574-
default:
12575-
break fake_return_waka123;
12576-
};
12571+
$1_1 = 3;
12572+
switch (0 | 0) {
12573+
default:
12574+
break fake_return_waka123;
1257712575
};
1257812576
}
1257912577
return $1_1 | 0;
@@ -12582,13 +12580,11 @@ function asmFunc(global, env, buffer) {
1258212580
function $21() {
1258312581
var $1_1 = 0, $2_1 = 0, $4_1 = 0;
1258412582
fake_return_waka123 : {
12585-
loop_in : while (1) {
12586-
dummy();
12587-
$1_1 = 4;
12588-
switch (-1 | 0) {
12589-
default:
12590-
break fake_return_waka123;
12591-
};
12583+
dummy();
12584+
$1_1 = 4;
12585+
switch (-1 | 0) {
12586+
default:
12587+
break fake_return_waka123;
1259212588
};
1259312589
}
1259412590
return $1_1 | 0;
@@ -12597,13 +12593,11 @@ function asmFunc(global, env, buffer) {
1259712593
function $22() {
1259812594
var $1_1 = 0;
1259912595
fake_return_waka123 : {
12600-
loop_in : while (1) {
12601-
dummy();
12602-
$1_1 = 5;
12603-
switch (1 | 0) {
12604-
default:
12605-
break fake_return_waka123;
12606-
};
12596+
dummy();
12597+
$1_1 = 5;
12598+
switch (1 | 0) {
12599+
default:
12600+
break fake_return_waka123;
1260712601
};
1260812602
}
1260912603
return $1_1 | 0;

test/wasm2js/br_table_temp.2asm.js

Lines changed: 14 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -12564,12 +12564,10 @@ function asmFunc(global, env, buffer) {
1256412564
function $20() {
1256512565
var $1_1 = 0, $2_1 = 0, $4_1 = 0;
1256612566
fake_return_waka123 : {
12567-
loop_in : while (1) {
12568-
$1_1 = 3;
12569-
switch (0 | 0) {
12570-
default:
12571-
break fake_return_waka123;
12572-
};
12567+
$1_1 = 3;
12568+
switch (0 | 0) {
12569+
default:
12570+
break fake_return_waka123;
1257312571
};
1257412572
}
1257512573
return $1_1 | 0;
@@ -12578,13 +12576,11 @@ function asmFunc(global, env, buffer) {
1257812576
function $21() {
1257912577
var $1_1 = 0, $2_1 = 0, $4_1 = 0;
1258012578
fake_return_waka123 : {
12581-
loop_in : while (1) {
12582-
dummy();
12583-
$1_1 = 4;
12584-
switch (-1 | 0) {
12585-
default:
12586-
break fake_return_waka123;
12587-
};
12579+
dummy();
12580+
$1_1 = 4;
12581+
switch (-1 | 0) {
12582+
default:
12583+
break fake_return_waka123;
1258812584
};
1258912585
}
1259012586
return $1_1 | 0;
@@ -12593,13 +12589,11 @@ function asmFunc(global, env, buffer) {
1259312589
function $22() {
1259412590
var $1_1 = 0;
1259512591
fake_return_waka123 : {
12596-
loop_in : while (1) {
12597-
dummy();
12598-
$1_1 = 5;
12599-
switch (1 | 0) {
12600-
default:
12601-
break fake_return_waka123;
12602-
};
12592+
dummy();
12593+
$1_1 = 5;
12594+
switch (1 | 0) {
12595+
default:
12596+
break fake_return_waka123;
1260312597
};
1260412598
}
1260512599
return $1_1 | 0;

test/wasm2js/excess_fallthrough.2asm.js

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -26,22 +26,20 @@ function asmFunc(global, env, buffer) {
2626

2727
function foo($0) {
2828
$0 = $0 | 0;
29-
label$4 : while (1) {
30-
label$5 : {
31-
bar();
32-
block : {
33-
switch (123 | 0) {
34-
case 0:
35-
bar();
36-
break;
37-
default:
38-
break label$5;
39-
};
40-
}
41-
return;
29+
label$5 : {
30+
bar();
31+
block : {
32+
switch (123 | 0) {
33+
case 0:
34+
bar();
35+
break;
36+
default:
37+
break label$5;
38+
};
4239
}
43-
abort();
44-
};
40+
return;
41+
}
42+
abort();
4543
}
4644

4745
var FUNCTION_TABLE = [];
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
2+
function asmFunc(global, env, buffer) {
3+
var HEAP8 = new global.Int8Array(buffer);
4+
var HEAP16 = new global.Int16Array(buffer);
5+
var HEAP32 = new global.Int32Array(buffer);
6+
var HEAPU8 = new global.Uint8Array(buffer);
7+
var HEAPU16 = new global.Uint16Array(buffer);
8+
var HEAPU32 = new global.Uint32Array(buffer);
9+
var HEAPF32 = new global.Float32Array(buffer);
10+
var HEAPF64 = new global.Float64Array(buffer);
11+
var Math_imul = global.Math.imul;
12+
var Math_fround = global.Math.fround;
13+
var Math_abs = global.Math.abs;
14+
var Math_clz32 = global.Math.clz32;
15+
var Math_min = global.Math.min;
16+
var Math_max = global.Math.max;
17+
var Math_floor = global.Math.floor;
18+
var Math_ceil = global.Math.ceil;
19+
var Math_sqrt = global.Math.sqrt;
20+
var abort = env.abort;
21+
var nan = global.NaN;
22+
var infinity = global.Infinity;
23+
var global$0 = 10;
24+
function $0($0_1) {
25+
$0_1 = $0_1 | 0;
26+
var $15 = Math_fround(0), $21 = 0, $29 = 0, $26 = 0;
27+
if (global$0) {
28+
return $0_1 | 0
29+
}
30+
if (global$0) {
31+
return $0_1 | 0
32+
}
33+
global$0 = 0;
34+
label$3 : while (1) {
35+
label$4 : {
36+
if (global$0) {
37+
return $0_1 | 0
38+
}
39+
if (global$0) {
40+
return $0_1 | 0
41+
}
42+
if (global$0) {
43+
return $0_1 | 0
44+
}
45+
$15 = Math_fround(0.0);
46+
if (global$0) {
47+
return $0_1 | 0
48+
}
49+
}
50+
$21 = 32;
51+
if (!$21) {
52+
continue label$3
53+
}
54+
$26 = 1;
55+
break label$3;
56+
};
57+
if (!$26) {
58+
$29 = 0
59+
} else {
60+
$29 = 1
61+
}
62+
if (!$29) {
63+
return -255 | 0
64+
} else {
65+
abort()
66+
}
67+
}
68+
69+
var FUNCTION_TABLE = [];
70+
return {
71+
"func_50": $0
72+
};
73+
}
74+
75+
var memasmFunc = new ArrayBuffer(65536);
76+
var retasmFunc = asmFunc({Math,Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array,NaN,Infinity}, {abort:function() { throw new Error('abort'); }},memasmFunc);
77+
export var func_50 = retasmFunc.func_50;
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
2+
function asmFunc(global, env, buffer) {
3+
var HEAP8 = new global.Int8Array(buffer);
4+
var HEAP16 = new global.Int16Array(buffer);
5+
var HEAP32 = new global.Int32Array(buffer);
6+
var HEAPU8 = new global.Uint8Array(buffer);
7+
var HEAPU16 = new global.Uint16Array(buffer);
8+
var HEAPU32 = new global.Uint32Array(buffer);
9+
var HEAPF32 = new global.Float32Array(buffer);
10+
var HEAPF64 = new global.Float64Array(buffer);
11+
var Math_imul = global.Math.imul;
12+
var Math_fround = global.Math.fround;
13+
var Math_abs = global.Math.abs;
14+
var Math_clz32 = global.Math.clz32;
15+
var Math_min = global.Math.min;
16+
var Math_max = global.Math.max;
17+
var Math_floor = global.Math.floor;
18+
var Math_ceil = global.Math.ceil;
19+
var Math_sqrt = global.Math.sqrt;
20+
var abort = env.abort;
21+
var nan = global.NaN;
22+
var infinity = global.Infinity;
23+
var global$0 = 10;
24+
function $0($0_1) {
25+
$0_1 = $0_1 | 0;
26+
folding_inner0 : {
27+
if (global$0) {
28+
break folding_inner0
29+
}
30+
global$0 = 0;
31+
if (global$0) {
32+
break folding_inner0
33+
}
34+
if (global$0) {
35+
break folding_inner0
36+
}
37+
abort();
38+
}
39+
return $0_1 | 0;
40+
}
41+
42+
var FUNCTION_TABLE = [];
43+
return {
44+
"func_50": $0
45+
};
46+
}
47+
48+
var memasmFunc = new ArrayBuffer(65536);
49+
var retasmFunc = asmFunc({Math,Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array,NaN,Infinity}, {abort:function() { throw new Error('abort'); }},memasmFunc);
50+
export var func_50 = retasmFunc.func_50;

0 commit comments

Comments
 (0)