@@ -648,12 +648,12 @@ exports.main = function main(argv, options, callback) {
648648 if ( optimizeLevel >= 3 || shrinkLevel >= 1 ) {
649649 add ( "ssa-nomerge" ) ;
650650 }
651- if ( optimizeLevel >= 4 ) {
651+ if ( optimizeLevel >= 3 ) {
652652 add ( "flatten" ) ;
653653 add ( "local-cse" ) ;
654654 }
655655 if ( hasARC ) { // differs
656- if ( optimizeLevel < 4 ) {
656+ if ( optimizeLevel < 3 ) {
657657 add ( "flatten" ) ;
658658 }
659659 add ( "post-assemblyscript" ) ;
@@ -670,9 +670,10 @@ exports.main = function main(argv, options, callback) {
670670 } else {
671671 add ( "precompute" ) ;
672672 }
673- if ( optimizeLevel >= 2 || shrinkLevel >= 2 ) {
674- add ( "code-pushing" ) ;
675- }
673+ // this will be done later
674+ // if (optimizeLevel >= 2 || shrinkLevel >= 2) {
675+ // add("code-pushing");
676+ // }
676677 add ( "simplify-locals-nostructure" ) ;
677678 add ( "vacuum" ) ;
678679 add ( "reorder-locals" ) ;
@@ -703,30 +704,64 @@ exports.main = function main(argv, options, callback) {
703704 if ( optimizeLevel >= 2 || shrinkLevel >= 1 ) {
704705 add ( "rse" ) ;
705706 }
706- if ( hasARC ) { // differs
707- add ( "post-assemblyscript-finalize" ) ;
708- }
709707 add ( "vacuum" ) ;
710-
711708 // PassRunner::addDefaultGlobalOptimizationPostPasses
712709 if ( optimizeLevel >= 2 || shrinkLevel >= 1 ) {
713710 add ( "dae-optimizing" ) ;
714711 }
715712 if ( optimizeLevel >= 2 || shrinkLevel >= 2 ) {
716713 add ( "inlining-optimizing" ) ;
717714 }
718- add ( "duplicate-function-elimination" ) ;
715+ // "duplicate-function-elimination" will better done later
716+ // add("duplicate-function-elimination");
719717 add ( "duplicate-import-elimination" ) ;
720718 if ( optimizeLevel >= 2 || shrinkLevel >= 2 ) {
721719 add ( "simplify-globals-optimizing" ) ;
722720 } else {
723721 add ( "simplify-globals" ) ;
724722 }
725- add ( "remove-unused-module-elements" ) ;
726- add ( "memory-packing" ) ;
727- add ( "directize" ) ;
723+ // replace indirect calls with direct, reduce arity and
724+ // inline this calls if possible
725+ add ( "directize" ) ; // differs
726+ add ( "dae-optimizing" ) ; // differs
728727 add ( "inlining-optimizing" ) ; // differs
729- if ( optimizeLevel >= 2 || shrinkLevel >= 1 ) {
728+ // ARC finalization should be done exactly after inlining for better release/retain reduction
729+ if ( hasARC ) { // differs
730+ add ( "post-assemblyscript-finalize" ) ;
731+ }
732+ if ( optimizeLevel >= 2 || shrinkLevel >= 1 ) { // differs
733+ add ( "rse" ) ;
734+ add ( "vacuum" ) ;
735+
736+ // rearrange / reduce switch cases again
737+ add ( "remove-unused-brs" ) ;
738+ add ( "remove-unused-names" ) ;
739+ add ( "merge-blocks" ) ;
740+ add ( "vacuum" ) ;
741+
742+ // replace indirect calls with direct and inline if possible again.
743+ add ( "directize" ) ;
744+ add ( "inlining-optimizing" ) ;
745+ // move some code after early return which potentially could reduce computations
746+ // do this after CFG cleanup (originally it was done before)
747+ add ( "code-pushing" ) ;
748+
749+ // this quite expensive so do this only for highest opt level
750+ if ( optimizeLevel >= 3 ) {
751+ add ( "simplify-locals-nostructure" ) ;
752+ add ( "reorder-locals" ) ;
753+ add ( "vacuum" ) ;
754+ }
755+ // finally optimize all remaining peepholes
756+ add ( "simplify-globals-optimizing" ) ;
757+ add ( "optimize-instructions" ) ;
758+ }
759+ // remove unused elements of table and pack / reduce memory
760+ add ( "duplicate-function-elimination" ) ; // differs
761+ add ( "remove-unused-nonfunction-module-elements" ) ; // differs
762+ add ( "memory-packing" ) ;
763+ add ( "remove-unused-module-elements" ) ; // differs
764+ if ( optimizeLevel >= 3 || shrinkLevel >= 1 ) { // differs. was optimizeLevel >= 2
730765 add ( "generate-stack-ir" ) ;
731766 add ( "optimize-stack-ir" ) ;
732767 }
0 commit comments