Skip to content

Commit 1465322

Browse files
authored
Use uncheked array access for Map#values/keys and Set#values methods (#2339)
1 parent 1f641be commit 1465322

File tree

10 files changed

+1252
-2390
lines changed

10 files changed

+1252
-2390
lines changed

Diff for: std/assembly/map.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ export class Map<K,V> {
201201
for (let i = 0; i < size; ++i) {
202202
let entry = changetype<MapEntry<K,V>>(start + <usize>i * ENTRY_SIZE<K,V>());
203203
if (!(entry.taggedNext & EMPTY)) {
204-
keys[length++] = entry.key;
204+
unchecked(keys[length++] = entry.key);
205205
}
206206
}
207207
keys.length = length;
@@ -217,7 +217,7 @@ export class Map<K,V> {
217217
for (let i = 0; i < size; ++i) {
218218
let entry = changetype<MapEntry<K,V>>(start + <usize>i * ENTRY_SIZE<K,V>());
219219
if (!(entry.taggedNext & EMPTY)) {
220-
values[length++] = entry.value;
220+
unchecked(values[length++] = entry.value);
221221
}
222222
}
223223
values.length = length;

Diff for: std/assembly/set.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ export class Set<T> {
185185
for (let i = 0; i < size; ++i) {
186186
let entry = changetype<SetEntry<T>>(start + <usize>i * ENTRY_SIZE<T>());
187187
if (!(entry.taggedNext & EMPTY)) {
188-
values[length++] = entry.key;
188+
unchecked(values[length++] = entry.key);
189189
}
190190
}
191191
values.length = length;

Diff for: tests/compiler/issues/2322/index.release.wat

+36-36
Original file line numberDiff line numberDiff line change
@@ -175,37 +175,37 @@
175175
local.get $4
176176
i32.store offset=4
177177
end
178-
local.get $2
178+
local.get $1
179+
local.get $0
179180
local.get $3
180181
i32.const 4
181182
i32.shl
183+
local.get $2
182184
i32.add
183185
i32.const 2
184186
i32.shl
185-
local.get $0
186187
i32.add
187188
i32.load offset=96
188-
local.get $1
189189
i32.eq
190190
if
191-
local.get $2
191+
local.get $0
192192
local.get $3
193193
i32.const 4
194194
i32.shl
195+
local.get $2
195196
i32.add
196197
i32.const 2
197198
i32.shl
198-
local.get $0
199199
i32.add
200200
local.get $5
201201
i32.store offset=96
202202
local.get $5
203203
i32.eqz
204204
if
205+
local.get $0
205206
local.get $3
206207
i32.const 2
207208
i32.shl
208-
local.get $0
209209
i32.add
210210
local.tee $1
211211
i32.load offset=4
@@ -356,12 +356,12 @@
356356
call $~lib/builtins/abort
357357
unreachable
358358
end
359-
local.get $2
359+
local.get $4
360360
local.get $1
361361
i32.const 4
362362
i32.add
363+
local.get $2
363364
i32.add
364-
local.get $4
365365
i32.ne
366366
if
367367
i32.const 0
@@ -422,14 +422,14 @@
422422
call $~lib/builtins/abort
423423
unreachable
424424
end
425-
local.get $2
425+
local.get $0
426426
local.get $5
427427
i32.const 4
428428
i32.shl
429+
local.get $2
429430
i32.add
430431
i32.const 2
431432
i32.shl
432-
local.get $0
433433
i32.add
434434
i32.load offset=96
435435
local.set $3
@@ -445,14 +445,14 @@
445445
local.get $1
446446
i32.store offset=4
447447
end
448-
local.get $2
448+
local.get $0
449449
local.get $5
450450
i32.const 4
451451
i32.shl
452+
local.get $2
452453
i32.add
453454
i32.const 2
454455
i32.shl
455-
local.get $0
456456
i32.add
457457
local.get $1
458458
i32.store offset=96
@@ -464,10 +464,10 @@
464464
i32.shl
465465
i32.or
466466
i32.store
467+
local.get $0
467468
local.get $5
468469
i32.const 2
469470
i32.shl
470-
local.get $0
471471
i32.add
472472
local.tee $0
473473
local.get $0
@@ -504,11 +504,11 @@
504504
i32.load offset=1568
505505
local.tee $4
506506
if
507-
local.get $1
508507
local.get $4
509508
i32.const 4
510509
i32.add
511-
i32.lt_u
510+
local.get $1
511+
i32.gt_u
512512
if
513513
i32.const 0
514514
i32.const 1392
@@ -517,10 +517,10 @@
517517
call $~lib/builtins/abort
518518
unreachable
519519
end
520-
local.get $4
521520
local.get $1
522521
i32.const 16
523522
i32.sub
523+
local.get $4
524524
i32.eq
525525
if
526526
local.get $4
@@ -532,11 +532,11 @@
532532
local.set $1
533533
end
534534
else
535-
local.get $1
536535
local.get $0
537536
i32.const 1572
538537
i32.add
539-
i32.lt_u
538+
local.get $1
539+
i32.gt_u
540540
if
541541
i32.const 0
542542
i32.const 1392
@@ -575,10 +575,10 @@
575575
local.get $1
576576
i32.const 0
577577
i32.store offset=8
578-
local.get $2
579578
local.get $1
580579
i32.const 4
581580
i32.add
581+
local.get $2
582582
i32.add
583583
local.tee $2
584584
i32.const 2
@@ -635,10 +635,10 @@
635635
i32.const 16
636636
i32.lt_u
637637
if
638-
local.get $1
639638
local.get $0
640639
i32.const 4
641640
i32.shl
641+
local.get $1
642642
i32.add
643643
i32.const 2
644644
i32.shl
@@ -699,25 +699,25 @@
699699
i32.and
700700
local.set $0
701701
loop $while-continue|1
702-
global.get $~lib/rt/itcms/toSpace
703702
local.get $0
703+
global.get $~lib/rt/itcms/toSpace
704704
i32.ne
705705
if
706706
local.get $0
707707
global.set $~lib/rt/itcms/iter
708+
local.get $1
708709
local.get $0
709710
i32.load offset=4
710711
i32.const 3
711712
i32.and
712-
local.get $1
713713
i32.ne
714714
if
715715
local.get $0
716-
local.get $1
717716
local.get $0
718717
i32.load offset=4
719718
i32.const -4
720719
i32.and
720+
local.get $1
721721
i32.or
722722
i32.store offset=4
723723
i32.const 0
@@ -774,23 +774,23 @@
774774
i32.and
775775
local.set $0
776776
loop $while-continue|2
777-
global.get $~lib/rt/itcms/toSpace
778777
local.get $0
778+
global.get $~lib/rt/itcms/toSpace
779779
i32.ne
780780
if
781+
local.get $1
781782
local.get $0
782783
i32.load offset=4
783784
i32.const 3
784785
i32.and
785-
local.get $1
786786
i32.ne
787787
if
788788
local.get $0
789-
local.get $1
790789
local.get $0
791790
i32.load offset=4
792791
i32.const -4
793792
i32.and
793+
local.get $1
794794
i32.or
795795
i32.store offset=4
796796
local.get $0
@@ -943,11 +943,11 @@
943943
i32.and
944944
local.tee $1
945945
if (result i32)
946+
local.get $0
946947
local.get $1
947948
i32.ctz
948949
i32.const 2
949950
i32.shl
950-
local.get $0
951951
i32.add
952952
i32.load offset=96
953953
else
@@ -957,12 +957,12 @@
957957
i32.and
958958
local.tee $1
959959
if (result i32)
960+
local.get $0
960961
local.get $1
961962
i32.ctz
962963
local.tee $2
963964
i32.const 2
964965
i32.shl
965-
local.get $0
966966
i32.add
967967
i32.load offset=4
968968
local.tee $1
@@ -975,6 +975,7 @@
975975
call $~lib/builtins/abort
976976
unreachable
977977
end
978+
local.get $0
978979
local.get $1
979980
i32.ctz
980981
local.get $2
@@ -983,7 +984,6 @@
983984
i32.add
984985
i32.const 2
985986
i32.shl
986-
local.get $0
987987
i32.add
988988
i32.load offset=96
989989
else
@@ -1277,19 +1277,19 @@
12771277
i32.load offset=8
12781278
local.set $3
12791279
local.get $0
1280-
local.get $2
12811280
global.get $~lib/rt/itcms/white
1281+
local.get $2
12821282
i32.or
12831283
i32.store offset=4
12841284
local.get $0
12851285
local.get $3
12861286
i32.store offset=8
12871287
local.get $3
1288+
local.get $0
12881289
local.get $3
12891290
i32.load offset=4
12901291
i32.const 3
12911292
i32.and
1292-
local.get $0
12931293
i32.or
12941294
i32.store offset=4
12951295
local.get $2
@@ -1350,8 +1350,8 @@
13501350
i32.and
13511351
i32.eq
13521352
if
1353-
global.get $~lib/rt/itcms/iter
13541353
local.get $1
1354+
global.get $~lib/rt/itcms/iter
13551355
i32.eq
13561356
if
13571357
local.get $1
@@ -1411,11 +1411,11 @@
14111411
local.get $2
14121412
i32.store offset=8
14131413
local.get $2
1414+
local.get $0
14141415
local.get $2
14151416
i32.load offset=4
14161417
i32.const 3
14171418
i32.and
1418-
local.get $0
14191419
i32.or
14201420
i32.store offset=4
14211421
end
@@ -1429,10 +1429,10 @@
14291429
if (result i32)
14301430
i32.const 1
14311431
else
1432+
local.get $0
14321433
i32.const 1440
14331434
i32.load
1434-
local.get $0
1435-
i32.lt_u
1435+
i32.gt_u
14361436
if
14371437
i32.const 1248
14381438
i32.const 1312
@@ -1469,11 +1469,11 @@
14691469
local.get $0
14701470
i32.store offset=8
14711471
local.get $0
1472+
local.get $1
14721473
local.get $0
14731474
i32.load offset=4
14741475
i32.const 3
14751476
i32.and
1476-
local.get $1
14771477
i32.or
14781478
i32.store offset=4
14791479
local.get $2

0 commit comments

Comments
 (0)