Skip to content

Commit 934f05e

Browse files
MaxGraeydcodeIO
authored andcommitted
Optimize array functional loops (AssemblyScript#359)
1 parent ebae7cb commit 934f05e

File tree

3 files changed

+176
-196
lines changed

3 files changed

+176
-196
lines changed

std/assembly/array.ts

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -74,15 +74,15 @@ export class Array<T> {
7474

7575
every(callbackfn: (element: T, index: i32, array: Array<T>) => bool): bool {
7676
var buffer = this.buffer_;
77-
for (let index = 0, toIndex = this.length_; index < toIndex && index < this.length_; ++index) {
77+
for (let index = 0, toIndex = this.length_; index < min(toIndex, this.length_); ++index) {
7878
if (!callbackfn(LOAD<T>(buffer, index), index, this)) return false;
7979
}
8080
return true;
8181
}
8282

8383
findIndex(predicate: (element: T, index: i32, array: Array<T>) => bool): i32 {
8484
var buffer = this.buffer_;
85-
for (let index = 0, toIndex = this.length_; index < toIndex && index < this.length_; ++index) {
85+
for (let index = 0, toIndex = this.length_; index < min(toIndex, this.length_); ++index) {
8686
if (predicate(LOAD<T>(buffer, index), index, this)) return index;
8787
}
8888
return -1;
@@ -262,17 +262,16 @@ export class Array<T> {
262262
var length = this.length_;
263263
var result = new Array<U>(length);
264264
var resultBuffer = result.buffer_;
265-
for (let index = 0; index < length && index < this.length_; ++index) {
265+
for (let index = 0; index < min(length, this.length_); ++index) {
266266
STORE<U>(resultBuffer, index, callbackfn(LOAD<T>(buffer, index), index, this));
267267
}
268268
return result;
269269
}
270270

271271
filter(callbackfn: (value: T, index: i32, array: Array<T>) => bool): Array<T> {
272272
var buffer = this.buffer_;
273-
var length = this.length_;
274273
var result = new Array<T>();
275-
for (let index = 0; index < length && index < this.length_; ++index) {
274+
for (let index = 0, toIndex = this.length_; index < min(toIndex, this.length_); ++index) {
276275
let value = LOAD<T>(buffer, index);
277276
if (callbackfn(value, index, this)) result.push(value);
278277
}
@@ -285,7 +284,7 @@ export class Array<T> {
285284
): U {
286285
var accum = initialValue;
287286
var buffer = this.buffer_;
288-
for (let index = 0, toIndex = this.length_; index < toIndex && index < this.length_; ++index) {
287+
for (let index = 0, toIndex = this.length_; index < min(toIndex, this.length_); ++index) {
289288
accum = callbackfn(accum, LOAD<T>(buffer, index), index, this);
290289
}
291290
return accum;
@@ -321,7 +320,7 @@ export class Array<T> {
321320

322321
some(callbackfn: (element: T, index: i32, array: Array<T>) => bool): bool {
323322
var buffer = this.buffer_;
324-
for (let index = 0, toIndex = this.length_; index < toIndex && index < this.length_; ++index) {
323+
for (let index = 0, toIndex = this.length_; index < min(toIndex, this.length_); ++index) {
325324
if (callbackfn(LOAD<T>(buffer, index), index, this)) return true;
326325
}
327326
return false;

tests/compiler/std/array.optimized.wat

Lines changed: 72 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -2679,7 +2679,7 @@
26792679
if
26802680
i32.const 0
26812681
i32.const 8
2682-
i32.const 337
2682+
i32.const 336
26832683
i32.const 42
26842684
call $~lib/env/abort
26852685
unreachable
@@ -2731,7 +2731,7 @@
27312731
if
27322732
i32.const 0
27332733
i32.const 8
2734-
i32.const 308
2734+
i32.const 307
27352735
i32.const 20
27362736
call $~lib/env/abort
27372737
unreachable
@@ -3061,22 +3061,19 @@
30613061
set_local $4
30623062
get_local $0
30633063
i32.load offset=4
3064-
set_local $5
3064+
set_local $3
30653065
loop $repeat|0
30663066
block $break|0
30673067
get_local $2
3068+
get_local $3
3069+
get_local $0
3070+
i32.load offset=4
3071+
tee_local $5
3072+
get_local $3
30683073
get_local $5
30693074
i32.lt_s
3070-
tee_local $3
3071-
if
3072-
get_local $2
3073-
get_local $0
3074-
i32.load offset=4
3075-
i32.lt_s
3076-
set_local $3
3077-
end
3078-
get_local $3
3079-
i32.eqz
3075+
select
3076+
i32.ge_s
30803077
br_if $break|0
30813078
i32.const 3
30823079
set_global $~argc
@@ -3147,22 +3144,19 @@
31473144
set_local $4
31483145
get_local $0
31493146
i32.load offset=4
3150-
set_local $5
3147+
set_local $3
31513148
loop $repeat|0
31523149
block $break|0
31533150
get_local $2
3151+
get_local $3
3152+
get_local $0
3153+
i32.load offset=4
3154+
tee_local $5
3155+
get_local $3
31543156
get_local $5
31553157
i32.lt_s
3156-
tee_local $3
3157-
if
3158-
get_local $2
3159-
get_local $0
3160-
i32.load offset=4
3161-
i32.lt_s
3162-
set_local $3
3163-
end
3164-
get_local $3
3165-
i32.eqz
3158+
select
3159+
i32.ge_s
31663160
br_if $break|0
31673161
i32.const 3
31683162
set_global $~argc
@@ -3233,22 +3227,19 @@
32333227
set_local $4
32343228
get_local $0
32353229
i32.load offset=4
3236-
set_local $5
3230+
set_local $3
32373231
loop $repeat|0
32383232
block $break|0
32393233
get_local $2
3234+
get_local $3
3235+
get_local $0
3236+
i32.load offset=4
3237+
tee_local $5
3238+
get_local $3
32403239
get_local $5
32413240
i32.lt_s
3242-
tee_local $3
3243-
if
3244-
get_local $2
3245-
get_local $0
3246-
i32.load offset=4
3247-
i32.lt_s
3248-
set_local $3
3249-
end
3250-
get_local $3
3251-
i32.eqz
3241+
select
3242+
i32.ge_s
32523243
br_if $break|0
32533244
i32.const 3
32543245
set_global $~argc
@@ -3389,27 +3380,25 @@
33893380
(local $6 i32)
33903381
get_local $0
33913382
i32.load
3392-
set_local $3
3383+
set_local $4
33933384
get_local $0
33943385
i32.load offset=4
3395-
tee_local $4
3386+
tee_local $3
33963387
call $~lib/array/Array<i32>#constructor
33973388
tee_local $5
33983389
i32.load
33993390
set_local $6
34003391
loop $repeat|0
34013392
get_local $1
3402-
get_local $4
3403-
i32.lt_s
3393+
get_local $3
3394+
get_local $0
3395+
i32.load offset=4
34043396
tee_local $2
3405-
if
3406-
get_local $1
3407-
get_local $0
3408-
i32.load offset=4
3409-
i32.lt_s
3410-
set_local $2
3411-
end
3397+
get_local $3
34123398
get_local $2
3399+
i32.lt_s
3400+
select
3401+
i32.lt_s
34133402
if
34143403
i32.const 3
34153404
set_global $~argc
@@ -3420,7 +3409,7 @@
34203409
get_local $6
34213410
i32.add
34223411
get_local $2
3423-
get_local $3
3412+
get_local $4
34243413
i32.add
34253414
i32.load offset=8
34263415
get_local $1
@@ -3460,30 +3449,27 @@
34603449
set_local $4
34613450
get_local $0
34623451
i32.load offset=4
3463-
tee_local $5
3452+
tee_local $3
34643453
call $~lib/array/Array<i32>#constructor
3465-
tee_local $6
3454+
tee_local $5
34663455
i32.load
3467-
set_local $7
3456+
set_local $6
34683457
loop $repeat|0
34693458
block $break|0
34703459
get_local $2
3471-
get_local $5
3472-
i32.lt_s
3473-
tee_local $3
3474-
if
3475-
get_local $2
3476-
get_local $0
3477-
i32.load offset=4
3478-
i32.lt_s
3479-
set_local $3
3480-
end
34813460
get_local $3
3482-
i32.eqz
3461+
get_local $0
3462+
i32.load offset=4
3463+
tee_local $7
3464+
get_local $3
3465+
get_local $7
3466+
i32.lt_s
3467+
select
3468+
i32.ge_s
34833469
br_if $break|0
34843470
i32.const 3
34853471
set_global $~argc
3486-
get_local $7
3472+
get_local $6
34873473
get_local $2
34883474
i32.const 2
34893475
i32.shl
@@ -3506,7 +3492,7 @@
35063492
br $repeat|0
35073493
end
35083494
end
3509-
get_local $6
3495+
get_local $5
35103496
)
35113497
(func $start~anonymous|23 (; 53 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
35123498
get_global $std/array/i
@@ -3538,30 +3524,27 @@
35383524
(local $6 i32)
35393525
get_local $0
35403526
i32.load
3541-
set_local $5
3542-
get_local $0
3543-
i32.load offset=4
35443527
set_local $6
35453528
i32.const 0
35463529
call $~lib/array/Array<i32>#constructor
35473530
set_local $4
3531+
get_local $0
3532+
i32.load offset=4
3533+
set_local $5
35483534
loop $repeat|0
35493535
block $break|0
35503536
get_local $2
3551-
get_local $6
3552-
i32.lt_s
3537+
get_local $5
3538+
get_local $0
3539+
i32.load offset=4
35533540
tee_local $3
3554-
if
3555-
get_local $2
3556-
get_local $0
3557-
i32.load offset=4
3558-
i32.lt_s
3559-
set_local $3
3560-
end
3541+
get_local $5
35613542
get_local $3
3562-
i32.eqz
3543+
i32.lt_s
3544+
select
3545+
i32.ge_s
35633546
br_if $break|0
3564-
get_local $5
3547+
get_local $6
35653548
get_local $2
35663549
i32.const 2
35673550
i32.shl
@@ -3639,22 +3622,19 @@
36393622
set_local $5
36403623
get_local $0
36413624
i32.load offset=4
3642-
set_local $6
3625+
set_local $4
36433626
loop $repeat|0
36443627
block $break|0
36453628
get_local $3
3629+
get_local $4
3630+
get_local $0
3631+
i32.load offset=4
3632+
tee_local $6
3633+
get_local $4
36463634
get_local $6
36473635
i32.lt_s
3648-
tee_local $4
3649-
if
3650-
get_local $3
3651-
get_local $0
3652-
i32.load offset=4
3653-
i32.lt_s
3654-
set_local $4
3655-
end
3656-
get_local $4
3657-
i32.eqz
3636+
select
3637+
i32.ge_s
36583638
br_if $break|0
36593639
i32.const 4
36603640
set_global $~argc
@@ -4202,7 +4182,7 @@
42024182
if
42034183
i32.const 0
42044184
i32.const 8
4205-
i32.const 409
4185+
i32.const 408
42064186
i32.const 4
42074187
call $~lib/env/abort
42084188
unreachable
@@ -4773,7 +4753,7 @@
47734753
if
47744754
i32.const 0
47754755
i32.const 8
4776-
i32.const 409
4756+
i32.const 408
47774757
i32.const 4
47784758
call $~lib/env/abort
47794759
unreachable
@@ -5345,7 +5325,7 @@
53455325
if
53465326
i32.const 0
53475327
i32.const 8
5348-
i32.const 409
5328+
i32.const 408
53495329
i32.const 4
53505330
call $~lib/env/abort
53515331
unreachable
@@ -5734,7 +5714,7 @@
57345714
if
57355715
i32.const 0
57365716
i32.const 8
5737-
i32.const 409
5717+
i32.const 408
57385718
i32.const 4
57395719
call $~lib/env/abort
57405720
unreachable

0 commit comments

Comments
 (0)