Skip to content

Commit 415e8b3

Browse files
authored
wasm2js: optimize loads (#2085)
When loading a boolean, prefer the signed heap (which is more commonly used, and may be faster). We never use HEAPU32 (HEAP32 is always enough), just remove it.
1 parent 909ac34 commit 415e8b3

96 files changed

Lines changed: 55 additions & 127 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

src/tools/wasm2js.cpp

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,10 @@ static void optimizeJS(Ref ast) {
189189

190190
auto getHeapFromAccess = [](Ref node) { return node[1]->getIString(); };
191191

192+
auto setHeapOnAccess = [](Ref node, IString heap) {
193+
node[1] = ValueBuilder::makeName(heap);
194+
};
195+
192196
auto isIntegerHeap = [](IString heap) {
193197
return heap == HEAP8 || heap == HEAPU8 || heap == HEAP16 ||
194198
heap == HEAPU16 || heap == HEAP32 || heap == HEAPU32;
@@ -236,6 +240,21 @@ static void optimizeJS(Ref ast) {
236240
else if (isBitwise(node)) {
237241
node[2] = removeOrZero(node[2]);
238242
node[3] = removeOrZero(node[3]);
243+
// A load into an & may allow using a simpler heap, e.g. HEAPU8[..] & 1
244+
// (a load of a boolean) may be HEAP8[..] & 1. The signed heaps are more
245+
// commonly used, so it compresses better, and also they seem to have
246+
// better performance (perhaps since HEAPU32 is at risk of not being a
247+
// smallint).
248+
if (node[1] == AND && isHeapAccess(node[2])) {
249+
auto heap = getHeapFromAccess(node[2]);
250+
if (isConstantAnd(node, 1)) {
251+
if (heap == HEAPU8) {
252+
setHeapOnAccess(node[2], HEAP8);
253+
} else if (heap == HEAPU16) {
254+
setHeapOnAccess(node[2], HEAP16);
255+
}
256+
}
257+
}
239258
}
240259
// +(+x) => +x
241260
else if (isPlus(node)) {
@@ -280,7 +299,6 @@ static void optimizeJS(Ref ast) {
280299

281300
// Remove unnecessary break/continue labels, when referring to the top level.
282301

283-
// XXX IString invalid("__wasm2js$INVALID_LABEL__");
284302
std::vector<Ref> breakCapturers;
285303
std::vector<Ref> continueCapturers;
286304
std::unordered_map<IString, Ref>

src/wasm2js.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -420,7 +420,6 @@ void Wasm2JSBuilder::addBasics(Ref ast) {
420420
addHeap(HEAP32, INT32ARRAY);
421421
addHeap(HEAPU8, UINT8ARRAY);
422422
addHeap(HEAPU16, UINT16ARRAY);
423-
addHeap(HEAPU32, UINT32ARRAY);
424423
addHeap(HEAPF32, FLOAT32ARRAY);
425424
addHeap(HEAPF64, FLOAT64ARRAY);
426425
// core asm.js imports
@@ -1687,7 +1686,6 @@ void Wasm2JSBuilder::addMemoryGrowthFuncs(Ref ast, Module* wasm) {
16871686
setHeap(HEAP32, INT32ARRAY);
16881687
setHeap(HEAPU8, UINT8ARRAY);
16891688
setHeap(HEAPU16, UINT16ARRAY);
1690-
setHeap(HEAPU32, UINT32ARRAY);
16911689
setHeap(HEAPF32, FLOAT32ARRAY);
16921690
setHeap(HEAPF64, FLOAT64ARRAY);
16931691

test/binaryen.js/emit_asmjs.js.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ function asmFunc(global, env, buffer) {
66
var HEAP32 = new global.Int32Array(buffer);
77
var HEAPU8 = new global.Uint8Array(buffer);
88
var HEAPU16 = new global.Uint16Array(buffer);
9-
var HEAPU32 = new global.Uint32Array(buffer);
109
var HEAPF32 = new global.Float32Array(buffer);
1110
var HEAPF64 = new global.Float64Array(buffer);
1211
var Math_imul = global.Math.imul;

test/wasm2js.asserts.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ function asmFunc0(global, env, buffer) {
3737
var HEAP32 = new global.Int32Array(buffer);
3838
var HEAPU8 = new global.Uint8Array(buffer);
3939
var HEAPU16 = new global.Uint16Array(buffer);
40-
var HEAPU32 = new global.Uint32Array(buffer);
4140
var HEAPF32 = new global.Float32Array(buffer);
4241
var HEAPF64 = new global.Float64Array(buffer);
4342
var Math_imul = global.Math.imul;

test/wasm2js.traps.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ function asmFunc0(global, env, buffer) {
3737
var HEAP32 = new global.Int32Array(buffer);
3838
var HEAPU8 = new global.Uint8Array(buffer);
3939
var HEAPU16 = new global.Uint16Array(buffer);
40-
var HEAPU32 = new global.Uint32Array(buffer);
4140
var HEAPF32 = new global.Float32Array(buffer);
4241
var HEAPF64 = new global.Float64Array(buffer);
4342
var Math_imul = global.Math.imul;

test/wasm2js/address.2asm.js

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ function asmFunc(global, env, buffer) {
77
var HEAP32 = new global.Int32Array(buffer);
88
var HEAPU8 = new global.Uint8Array(buffer);
99
var HEAPU16 = new global.Uint16Array(buffer);
10-
var HEAPU32 = new global.Uint32Array(buffer);
1110
var HEAPF32 = new global.Float32Array(buffer);
1211
var HEAPF64 = new global.Float64Array(buffer);
1312
var Math_imul = global.Math.imul;
@@ -59,7 +58,6 @@ function asmFunc(global, env, buffer) {
5958
HEAP32 = new global.Int32Array(newBuffer);
6059
HEAPU8 = new global.Uint8Array(newBuffer);
6160
HEAPU16 = new global.Uint16Array(newBuffer);
62-
HEAPU32 = new global.Uint32Array(newBuffer);
6361
HEAPF32 = new global.Float32Array(newBuffer);
6462
HEAPF64 = new global.Float64Array(newBuffer);
6563
buffer = newBuffer;

test/wasm2js/base64.2asm.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ function asmFunc(global, env, buffer) {
66
var HEAP32 = new global.Int32Array(buffer);
77
var HEAPU8 = new global.Uint8Array(buffer);
88
var HEAPU16 = new global.Uint16Array(buffer);
9-
var HEAPU32 = new global.Uint32Array(buffer);
109
var HEAPF32 = new global.Float32Array(buffer);
1110
var HEAPF64 = new global.Float64Array(buffer);
1211
var Math_imul = global.Math.imul;

test/wasm2js/base64.2asm.js.opt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ function asmFunc(global, env, buffer) {
66
var HEAP32 = new global.Int32Array(buffer);
77
var HEAPU8 = new global.Uint8Array(buffer);
88
var HEAPU16 = new global.Uint16Array(buffer);
9-
var HEAPU32 = new global.Uint32Array(buffer);
109
var HEAPF32 = new global.Float32Array(buffer);
1110
var HEAPF64 = new global.Float64Array(buffer);
1211
var Math_imul = global.Math.imul;

test/wasm2js/block.2asm.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ function asmFunc(global, env, buffer) {
66
var HEAP32 = new global.Int32Array(buffer);
77
var HEAPU8 = new global.Uint8Array(buffer);
88
var HEAPU16 = new global.Uint16Array(buffer);
9-
var HEAPU32 = new global.Uint32Array(buffer);
109
var HEAPF32 = new global.Float32Array(buffer);
1110
var HEAPF64 = new global.Float64Array(buffer);
1211
var Math_imul = global.Math.imul;

test/wasm2js/br.2asm.js

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ function asmFunc(global, env, buffer) {
77
var HEAP32 = new global.Int32Array(buffer);
88
var HEAPU8 = new global.Uint8Array(buffer);
99
var HEAPU16 = new global.Uint16Array(buffer);
10-
var HEAPU32 = new global.Uint32Array(buffer);
1110
var HEAPF32 = new global.Float32Array(buffer);
1211
var HEAPF64 = new global.Float64Array(buffer);
1312
var Math_imul = global.Math.imul;
@@ -772,7 +771,6 @@ function asmFunc(global, env, buffer) {
772771
var HEAP32 = new global.Int32Array(buffer);
773772
var HEAPU8 = new global.Uint8Array(buffer);
774773
var HEAPU16 = new global.Uint16Array(buffer);
775-
var HEAPU32 = new global.Uint32Array(buffer);
776774
var HEAPF32 = new global.Float32Array(buffer);
777775
var HEAPF64 = new global.Float64Array(buffer);
778776
var Math_imul = global.Math.imul;

0 commit comments

Comments
 (0)