Skip to content

Commit aec91e5

Browse files
authored
JS VMs struggle to recognize when the condition part of a for loop is constant, especially w.r.t. GLctx.getProgramParameter(), so make sure that no repeated computation is done in such paths. (#20439)
1 parent 9445d6a commit aec91e5

9 files changed

+57
-44
lines changed

src/library_webgl.js

Lines changed: 33 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2182,7 +2182,8 @@ for (/**@suppress{duplicate}*/var i = 0; i <= {{{ GL_POOL_TEMP_BUFFERS_SIZE }}};
21822182
// maps integer locations back to uniform name strings, so that we can lazily fetch uniform array locations
21832183
program.uniformArrayNamesById = {};
21842184

2185-
for (i = 0; i < GLctx.getProgramParameter(program, 0x8B86/*GL_ACTIVE_UNIFORMS*/); ++i) {
2185+
var numActiveUniforms = GLctx.getProgramParameter(program, 0x8B86/*GL_ACTIVE_UNIFORMS*/);
2186+
for (i = 0; i < numActiveUniforms; ++i) {
21862187
var u = GLctx.getActiveUniform(program, i);
21872188
var nm = u.name;
21882189
var sz = u.size;
@@ -2499,8 +2500,9 @@ for (/**@suppress{duplicate}*/var i = 0; i <= {{{ GL_POOL_TEMP_BUFFERS_SIZE }}};
24992500
#if GL_POOL_TEMP_BUFFERS
25002501
if (count <= {{{ GL_POOL_TEMP_BUFFERS_SIZE / 2 }}}) {
25012502
// avoid allocation when uploading few enough uniforms
2502-
var view = miniTempWebGLIntBuffers[2*count];
2503-
for (var i = 0; i < 2*count; i += 2) {
2503+
count *= 2;
2504+
var view = miniTempWebGLIntBuffers[count];
2505+
for (var i = 0; i < count; i += 2) {
25042506
view[i] = {{{ makeGetValue('value', '4*i', 'i32') }}};
25052507
view[i+1] = {{{ makeGetValue('value', '4*i+4', 'i32') }}};
25062508
}
@@ -2541,8 +2543,9 @@ for (/**@suppress{duplicate}*/var i = 0; i <= {{{ GL_POOL_TEMP_BUFFERS_SIZE }}};
25412543
#if GL_POOL_TEMP_BUFFERS
25422544
if (count <= {{{ GL_POOL_TEMP_BUFFERS_SIZE / 3 }}}) {
25432545
// avoid allocation when uploading few enough uniforms
2544-
var view = miniTempWebGLIntBuffers[3*count];
2545-
for (var i = 0; i < 3*count; i += 3) {
2546+
count *= 3;
2547+
var view = miniTempWebGLIntBuffers[count];
2548+
for (var i = 0; i < count; i += 3) {
25462549
view[i] = {{{ makeGetValue('value', '4*i', 'i32') }}};
25472550
view[i+1] = {{{ makeGetValue('value', '4*i+4', 'i32') }}};
25482551
view[i+2] = {{{ makeGetValue('value', '4*i+8', 'i32') }}};
@@ -2584,8 +2587,9 @@ for (/**@suppress{duplicate}*/var i = 0; i <= {{{ GL_POOL_TEMP_BUFFERS_SIZE }}};
25842587
#if GL_POOL_TEMP_BUFFERS
25852588
if (count <= {{{ GL_POOL_TEMP_BUFFERS_SIZE / 4 }}}) {
25862589
// avoid allocation when uploading few enough uniforms
2587-
var view = miniTempWebGLIntBuffers[4*count];
2588-
for (var i = 0; i < 4*count; i += 4) {
2590+
count *= 4;
2591+
var view = miniTempWebGLIntBuffers[count];
2592+
for (var i = 0; i < count; i += 4) {
25892593
view[i] = {{{ makeGetValue('value', '4*i', 'i32') }}};
25902594
view[i+1] = {{{ makeGetValue('value', '4*i+4', 'i32') }}};
25912595
view[i+2] = {{{ makeGetValue('value', '4*i+8', 'i32') }}};
@@ -2669,8 +2673,9 @@ for (/**@suppress{duplicate}*/var i = 0; i <= {{{ GL_POOL_TEMP_BUFFERS_SIZE }}};
26692673
#if GL_POOL_TEMP_BUFFERS
26702674
if (count <= {{{ GL_POOL_TEMP_BUFFERS_SIZE / 2 }}}) {
26712675
// avoid allocation when uploading few enough uniforms
2672-
var view = miniTempWebGLFloatBuffers[2*count];
2673-
for (var i = 0; i < 2*count; i += 2) {
2676+
count *= 2;
2677+
var view = miniTempWebGLFloatBuffers[count];
2678+
for (var i = 0; i < count; i += 2) {
26742679
view[i] = {{{ makeGetValue('value', '4*i', 'float') }}};
26752680
view[i+1] = {{{ makeGetValue('value', '4*i+4', 'float') }}};
26762681
}
@@ -2711,8 +2716,9 @@ for (/**@suppress{duplicate}*/var i = 0; i <= {{{ GL_POOL_TEMP_BUFFERS_SIZE }}};
27112716
#if GL_POOL_TEMP_BUFFERS
27122717
if (count <= {{{ GL_POOL_TEMP_BUFFERS_SIZE / 3 }}}) {
27132718
// avoid allocation when uploading few enough uniforms
2714-
var view = miniTempWebGLFloatBuffers[3*count];
2715-
for (var i = 0; i < 3*count; i += 3) {
2719+
count *= 3;
2720+
var view = miniTempWebGLFloatBuffers[count];
2721+
for (var i = 0; i < count; i += 3) {
27162722
view[i] = {{{ makeGetValue('value', '4*i', 'float') }}};
27172723
view[i+1] = {{{ makeGetValue('value', '4*i+4', 'float') }}};
27182724
view[i+2] = {{{ makeGetValue('value', '4*i+8', 'float') }}};
@@ -2758,7 +2764,8 @@ for (/**@suppress{duplicate}*/var i = 0; i <= {{{ GL_POOL_TEMP_BUFFERS_SIZE }}};
27582764
// hoist the heap out of the loop for size and for pthreads+growth.
27592765
var heap = HEAPF32;
27602766
value = {{{ getHeapOffset('value', 'float') }}};
2761-
for (var i = 0; i < 4 * count; i += 4) {
2767+
count *= 4;
2768+
for (var i = 0; i < count; i += 4) {
27622769
var dst = value + i;
27632770
view[i] = heap[dst];
27642771
view[i + 1] = heap[dst + 1];
@@ -2802,8 +2809,9 @@ for (/**@suppress{duplicate}*/var i = 0; i <= {{{ GL_POOL_TEMP_BUFFERS_SIZE }}};
28022809
#if GL_POOL_TEMP_BUFFERS
28032810
if (count <= {{{ GL_POOL_TEMP_BUFFERS_SIZE / 4 }}}) {
28042811
// avoid allocation when uploading few enough uniforms
2805-
var view = miniTempWebGLFloatBuffers[4*count];
2806-
for (var i = 0; i < 4*count; i += 4) {
2812+
count *= 4;
2813+
var view = miniTempWebGLFloatBuffers[count];
2814+
for (var i = 0; i < count; i += 4) {
28072815
view[i] = {{{ makeGetValue('value', '4*i', 'float') }}};
28082816
view[i+1] = {{{ makeGetValue('value', '4*i+4', 'float') }}};
28092817
view[i+2] = {{{ makeGetValue('value', '4*i+8', 'float') }}};
@@ -2846,8 +2854,9 @@ for (/**@suppress{duplicate}*/var i = 0; i <= {{{ GL_POOL_TEMP_BUFFERS_SIZE }}};
28462854
#if GL_POOL_TEMP_BUFFERS
28472855
if (count <= {{{ GL_POOL_TEMP_BUFFERS_SIZE / 9 }}}) {
28482856
// avoid allocation when uploading few enough uniforms
2849-
var view = miniTempWebGLFloatBuffers[9*count];
2850-
for (var i = 0; i < 9*count; i += 9) {
2857+
count *= 9;
2858+
var view = miniTempWebGLFloatBuffers[count];
2859+
for (var i = 0; i < count; i += 9) {
28512860
view[i] = {{{ makeGetValue('value', '4*i', 'float') }}};
28522861
view[i+1] = {{{ makeGetValue('value', '4*i+4', 'float') }}};
28532862
view[i+2] = {{{ makeGetValue('value', '4*i+8', 'float') }}};
@@ -2899,7 +2908,8 @@ for (/**@suppress{duplicate}*/var i = 0; i <= {{{ GL_POOL_TEMP_BUFFERS_SIZE }}};
28992908
// hoist the heap out of the loop for size and for pthreads+growth.
29002909
var heap = HEAPF32;
29012910
value = {{{ getHeapOffset('value', 'float') }}};
2902-
for (var i = 0; i < 16 * count; i += 16) {
2911+
count *= 16;
2912+
for (var i = 0; i < count; i += 16) {
29032913
var dst = value + i;
29042914
view[i] = heap[dst];
29052915
view[i + 1] = heap[dst + 1];
@@ -3351,21 +3361,24 @@ for (/**@suppress{duplicate}*/var i = 0; i <= {{{ GL_POOL_TEMP_BUFFERS_SIZE }}};
33513361
{{{ makeSetValue('p', '0', 'log.length + 1', 'i32') }}};
33523362
} else if (pname == 0x8B87 /* GL_ACTIVE_UNIFORM_MAX_LENGTH */) {
33533363
if (!program.maxUniformLength) {
3354-
for (var i = 0; i < GLctx.getProgramParameter(program, 0x8B86/*GL_ACTIVE_UNIFORMS*/); ++i) {
3364+
var numActiveUniforms = GLctx.getProgramParameter(program, 0x8B86/*GL_ACTIVE_UNIFORMS*/);
3365+
for (var i = 0; i < numActiveUniforms; ++i) {
33553366
program.maxUniformLength = Math.max(program.maxUniformLength, GLctx.getActiveUniform(program, i).name.length+1);
33563367
}
33573368
}
33583369
{{{ makeSetValue('p', '0', 'program.maxUniformLength', 'i32') }}};
33593370
} else if (pname == 0x8B8A /* GL_ACTIVE_ATTRIBUTE_MAX_LENGTH */) {
33603371
if (!program.maxAttributeLength) {
3361-
for (var i = 0; i < GLctx.getProgramParameter(program, 0x8B89/*GL_ACTIVE_ATTRIBUTES*/); ++i) {
3372+
var numActiveAttributes = GLctx.getProgramParameter(program, 0x8B89/*GL_ACTIVE_ATTRIBUTES*/);
3373+
for (var i = 0; i < numActiveAttributes; ++i) {
33623374
program.maxAttributeLength = Math.max(program.maxAttributeLength, GLctx.getActiveAttrib(program, i).name.length+1);
33633375
}
33643376
}
33653377
{{{ makeSetValue('p', '0', 'program.maxAttributeLength', 'i32') }}};
33663378
} else if (pname == 0x8A35 /* GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH */) {
33673379
if (!program.maxUniformBlockNameLength) {
3368-
for (var i = 0; i < GLctx.getProgramParameter(program, 0x8A36/*GL_ACTIVE_UNIFORM_BLOCKS*/); ++i) {
3380+
var numActiveUniformBlocks = GLctx.getProgramParameter(program, 0x8A36/*GL_ACTIVE_UNIFORM_BLOCKS*/);
3381+
for (var i = 0; i < numActiveUniformBlocks; ++i) {
33693382
program.maxUniformBlockNameLength = Math.max(program.maxUniformBlockNameLength, GLctx.getActiveUniformBlockName(program, i).length+1);
33703383
}
33713384
}

test/code_size/embind_hello_wasm.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
"a.js": 9920,
55
"a.js.gz": 4354,
66
"a.wasm": 7715,
7-
"a.wasm.gz": 3512,
7+
"a.wasm.gz": 3508,
88
"total": 18187,
9-
"total_gz": 8246
9+
"total_gz": 8242
1010
}

test/code_size/hello_webgl2_wasm.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
{
22
"a.html": 454,
33
"a.html.gz": 328,
4-
"a.js": 4521,
5-
"a.js.gz": 2308,
4+
"a.js": 4531,
5+
"a.js.gz": 2312,
66
"a.wasm": 10399,
77
"a.wasm.gz": 6695,
8-
"total": 15374,
9-
"total_gz": 9331
8+
"total": 15384,
9+
"total_gz": 9335
1010
}
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
{
22
"a.html": 346,
33
"a.html.gz": 262,
4-
"a.js": 22193,
5-
"a.js.gz": 11583,
6-
"total": 22539,
7-
"total_gz": 11845
4+
"a.js": 22203,
5+
"a.js.gz": 11588,
6+
"total": 22549,
7+
"total_gz": 11850
88
}

test/code_size/hello_webgl_wasm.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
{
22
"a.html": 454,
33
"a.html.gz": 328,
4-
"a.js": 4059,
5-
"a.js.gz": 2153,
4+
"a.js": 4069,
5+
"a.js.gz": 2158,
66
"a.wasm": 10399,
77
"a.wasm.gz": 6695,
8-
"total": 14912,
9-
"total_gz": 9176
8+
"total": 14922,
9+
"total_gz": 9181
1010
}
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
{
22
"a.html": 346,
33
"a.html.gz": 262,
4-
"a.js": 21719,
5-
"a.js.gz": 11419,
6-
"total": 22065,
7-
"total_gz": 11681
4+
"a.js": 21729,
5+
"a.js.gz": 11423,
6+
"total": 22075,
7+
"total_gz": 11685
88
}

test/code_size/math_wasm.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
"a.js": 110,
55
"a.js.gz": 125,
66
"a.wasm": 2719,
7-
"a.wasm.gz": 1674,
7+
"a.wasm.gz": 1673,
88
"total": 3381,
9-
"total_gz": 2179
9+
"total_gz": 2178
1010
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"a.html": 12690,
3-
"a.html.gz": 6857,
3+
"a.html.gz": 6855,
44
"total": 12690,
5-
"total_gz": 6857
5+
"total_gz": 6855
66
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"a.html": 17277,
3-
"a.html.gz": 7489,
3+
"a.html.gz": 7486,
44
"total": 17277,
5-
"total_gz": 7489
5+
"total_gz": 7486
66
}

0 commit comments

Comments
 (0)