Skip to content

Commit f700e2a

Browse files
MaxGraeydcodeIO
authored andcommitted
Improve pass order even more (AssemblyScript#1050)
1 parent b1371f5 commit f700e2a

34 files changed

+1622
-3860
lines changed

cli/asc.js

Lines changed: 34 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -662,15 +662,16 @@ exports.main = function main(argv, options, callback) {
662662
add("remove-unused-brs");
663663
add("remove-unused-names");
664664
add("optimize-instructions");
665-
if (optimizeLevel >= 2 || shrinkLevel >= 2) {
665+
if (optimizeLevel >= 2 || shrinkLevel >= 1) {
666666
add("pick-load-signs");
667+
add("simplify-globals-optimizing"); // differs
667668
}
668669
if (optimizeLevel >= 3 || shrinkLevel >= 2) {
669670
add("precompute-propagate");
670671
} else {
671672
add("precompute");
672673
}
673-
// this will be done later
674+
// this will be done later (1)
674675
// if (optimizeLevel >= 2 || shrinkLevel >= 2) {
675676
// add("code-pushing");
676677
// }
@@ -691,15 +692,19 @@ exports.main = function main(argv, options, callback) {
691692
if (optimizeLevel >= 3 || shrinkLevel >= 1) {
692693
add("code-folding");
693694
}
695+
if (optimizeLevel >= 2 || shrinkLevel >= 1) { // differs
696+
add("simplify-globals-optimizing");
697+
}
694698
add("merge-blocks");
695699
add("remove-unused-brs");
696700
add("remove-unused-names");
697701
add("merge-blocks");
698-
if (optimizeLevel >= 3 || shrinkLevel >= 2) {
699-
add("precompute-propagate");
700-
} else {
701-
add("precompute");
702-
}
702+
// make this later & move to (2)
703+
// if (optimizeLevel >= 3 || shrinkLevel >= 2) {
704+
// add("precompute-propagate");
705+
// } else {
706+
// add("precompute");
707+
// }
703708
add("optimize-instructions");
704709
if (optimizeLevel >= 2 || shrinkLevel >= 1) {
705710
add("rse");
@@ -720,6 +725,13 @@ exports.main = function main(argv, options, callback) {
720725
} else {
721726
add("simplify-globals");
722727
}
728+
// moved from (2)
729+
// it works better after globals optimizations like simplify-globals, inlining-optimizing and etc
730+
if (optimizeLevel >= 2 || shrinkLevel >= 1) { // differs
731+
add("precompute-propagate");
732+
} else {
733+
add("precompute");
734+
}
723735
// replace indirect calls with direct, reduce arity and
724736
// inline this calls if possible
725737
add("directize"); // differs
@@ -731,40 +743,44 @@ exports.main = function main(argv, options, callback) {
731743
}
732744
if (optimizeLevel >= 2 || shrinkLevel >= 1) { // differs
733745
add("rse");
734-
add("vacuum");
735-
736746
// rearrange / reduce switch cases again
737747
add("remove-unused-brs");
738-
add("remove-unused-names");
739-
add("merge-blocks");
740748
add("vacuum");
741749

742750
// replace indirect calls with direct and inline if possible again.
743751
add("directize");
744752
add("inlining-optimizing");
745753
// move some code after early return which potentially could reduce computations
746754
// do this after CFG cleanup (originally it was done before)
755+
// moved from (1)
747756
add("code-pushing");
748757

749758
// this quite expensive so do this only for highest opt level
759+
add("simplify-globals-optimizing");
750760
if (optimizeLevel >= 3) {
751761
add("simplify-locals-nostructure");
752-
add("reorder-locals");
753762
add("vacuum");
763+
764+
add("precompute-propagate");
765+
add("simplify-locals-nostructure");
766+
add("vacuum");
767+
768+
add("reorder-locals");
769+
} else {
770+
add("simplify-globals-optimizing");
754771
}
755-
// finally optimize all remaining peepholes
756-
add("simplify-globals-optimizing");
757772
add("optimize-instructions");
758773
}
759774
// remove unused elements of table and pack / reduce memory
760775
add("duplicate-function-elimination"); // differs
761776
add("remove-unused-nonfunction-module-elements"); // differs
762777
add("memory-packing");
763778
add("remove-unused-module-elements"); // differs
764-
if (optimizeLevel >= 3 || shrinkLevel >= 1) { // differs. was optimizeLevel >= 2
765-
add("generate-stack-ir");
766-
add("optimize-stack-ir");
767-
}
779+
// It seems stack-ir unuseful for our needs.
780+
// if (optimizeLevel >= 3 || shrinkLevel >= 1) { // differs. was optimizeLevel >= 2
781+
// add("generate-stack-ir");
782+
// add("optimize-stack-ir");
783+
// }
768784
}
769785

770786
// Append additional passes if requested and execute

tests/allocators/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,6 @@
33
"scripts": {
44
"test": "node ./index",
55
"test:forever": "node ./forever",
6-
"test:all": "npm run test rt-full && npm run test rt-stub && npm run test buddy"
6+
"test:all": "npm run test rt-full && npm run test rt-stub"
77
}
88
}

tests/allocators/rt-full/optimized.wat

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -407,7 +407,7 @@
407407
(local $1 i32)
408408
(local $2 i32)
409409
global.get $~lib/rt/tlsf/ROOT
410-
local.tee $2
410+
local.tee $0
411411
i32.eqz
412412
if
413413
i32.const 1
@@ -428,56 +428,53 @@
428428
unreachable
429429
end
430430
i32.const 272
431-
local.set $2
432-
i32.const 272
431+
local.tee $0
433432
i32.const 0
434433
i32.store
435434
i32.const 1840
436435
i32.const 0
437436
i32.store
438-
i32.const 0
439-
local.set $0
440437
loop $loop|0
441-
local.get $0
438+
local.get $1
442439
i32.const 23
443440
i32.lt_u
444441
if
445-
local.get $0
442+
local.get $1
446443
i32.const 2
447444
i32.shl
448445
i32.const 272
449446
i32.add
450447
i32.const 0
451448
i32.store offset=4
452449
i32.const 0
453-
local.set $1
450+
local.set $2
454451
loop $loop|1
455-
local.get $1
452+
local.get $2
456453
i32.const 16
457454
i32.lt_u
458455
if
459456
local.get $1
460-
local.get $0
461457
i32.const 4
462458
i32.shl
459+
local.get $2
463460
i32.add
464461
i32.const 2
465462
i32.shl
466463
i32.const 272
467464
i32.add
468465
i32.const 0
469466
i32.store offset=96
470-
local.get $1
467+
local.get $2
471468
i32.const 1
472469
i32.add
473-
local.set $1
470+
local.set $2
474471
br $loop|1
475472
end
476473
end
477-
local.get $0
474+
local.get $1
478475
i32.const 1
479476
i32.add
480-
local.set $0
477+
local.set $1
481478
br $loop|0
482479
end
483480
end
@@ -490,7 +487,7 @@
490487
i32.const 272
491488
global.set $~lib/rt/tlsf/ROOT
492489
end
493-
local.get $2
490+
local.get $0
494491
)
495492
(func $~lib/rt/tlsf/prepareSize (; 5 ;) (param $0 i32) (result i32)
496493
local.get $0

tests/compiler/comma.optimized.wat

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -73,17 +73,6 @@
7373
global.set $comma/a
7474
i32.const 1
7575
global.set $comma/b
76-
global.get $comma/b
77-
i32.const 1
78-
i32.ne
79-
if
80-
i32.const 0
81-
i32.const 32
82-
i32.const 15
83-
i32.const 0
84-
call $~lib/builtins/abort
85-
unreachable
86-
end
8776
global.get $comma/a
8877
i32.const 1
8978
i32.add

tests/compiler/constructor.optimized.wat

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -162,13 +162,14 @@
162162
i32.const 12
163163
call $~lib/rt/stub/__alloc
164164
local.tee $0
165-
if (result i32)
166-
local.get $0
167-
else
165+
i32.eqz
166+
if
168167
i32.const 0
169168
i32.const 12
170169
call $~lib/rt/stub/__alloc
170+
local.set $0
171171
end
172+
local.get $0
172173
global.set $constructor/ctorConditionallyAllocates
173174
)
174175
(func $start (; 3 ;)

tests/compiler/extends-baseaggregate.optimized.wat

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -598,7 +598,7 @@
598598
(local $1 i32)
599599
(local $2 i32)
600600
global.get $~lib/rt/tlsf/ROOT
601-
local.tee $2
601+
local.tee $0
602602
i32.eqz
603603
if
604604
i32.const 1
@@ -619,56 +619,53 @@
619619
unreachable
620620
end
621621
i32.const 560
622-
local.set $2
623-
i32.const 560
622+
local.tee $0
624623
i32.const 0
625624
i32.store
626625
i32.const 2128
627626
i32.const 0
628627
i32.store
629-
i32.const 0
630-
local.set $0
631628
loop $loop|0
632-
local.get $0
629+
local.get $1
633630
i32.const 23
634631
i32.lt_u
635632
if
636-
local.get $0
633+
local.get $1
637634
i32.const 2
638635
i32.shl
639636
i32.const 560
640637
i32.add
641638
i32.const 0
642639
i32.store offset=4
643640
i32.const 0
644-
local.set $1
641+
local.set $2
645642
loop $loop|1
646-
local.get $1
643+
local.get $2
647644
i32.const 16
648645
i32.lt_u
649646
if
650647
local.get $1
651-
local.get $0
652648
i32.const 4
653649
i32.shl
650+
local.get $2
654651
i32.add
655652
i32.const 2
656653
i32.shl
657654
i32.const 560
658655
i32.add
659656
i32.const 0
660657
i32.store offset=96
661-
local.get $1
658+
local.get $2
662659
i32.const 1
663660
i32.add
664-
local.set $1
661+
local.set $2
665662
br $loop|1
666663
end
667664
end
668-
local.get $0
665+
local.get $1
669666
i32.const 1
670667
i32.add
671-
local.set $0
668+
local.set $1
672669
br $loop|0
673670
end
674671
end
@@ -681,7 +678,7 @@
681678
i32.const 560
682679
global.set $~lib/rt/tlsf/ROOT
683680
end
684-
local.get $2
681+
local.get $0
685682
)
686683
(func $~lib/rt/tlsf/prepareSize (; 5 ;) (param $0 i32) (result i32)
687684
local.get $0
@@ -1637,10 +1634,10 @@
16371634
local.get $6
16381635
call $~lib/rt/tlsf/removeBlock
16391636
local.get $1
1640-
local.get $5
16411637
local.get $4
16421638
i32.const 3
16431639
i32.and
1640+
local.get $5
16441641
i32.or
16451642
i32.store
16461643
local.get $1

0 commit comments

Comments
 (0)