@@ -25,12 +25,14 @@ use crate::{
2525 } ,
2626 pipeline:: {
2727 ability_processor:: AbilityProcessor ,
28+ common_subexp_elimination:: CommonSubexpElimination ,
2829 control_flow_graph_simplifier:: ControlFlowGraphSimplifier ,
2930 dead_store_elimination:: DeadStoreElimination ,
3031 exit_state_analysis:: ExitStateAnalysisProcessor ,
3132 flush_writes_processor:: FlushWritesProcessor ,
3233 lint_processor:: LintProcessor ,
3334 livevar_analysis_processor:: LiveVarAnalysisProcessor ,
35+ reaching_def_analysis_processor:: ReachingDefProcessor ,
3436 reference_safety:: { reference_safety_processor_v2, reference_safety_processor_v3} ,
3537 split_critical_edges_processor:: SplitCriticalEdgesProcessor ,
3638 uninitialized_use_checker:: UninitializedUseChecker ,
@@ -556,6 +558,26 @@ pub fn stackless_bytecode_optimization_pipeline(options: &Options) -> FunctionTa
556558 pipeline. add_processor ( Box :: new ( SplitCriticalEdgesProcessor { } ) ) ;
557559 }
558560
561+ // Common subexpression elimination
562+ // Need to run before `ABILITY_CHECK`
563+ // Further, all annotations are clearned after this pass
564+ if options. experiment_on ( Experiment :: COMMON_SUBEXP_ELIMINATION ) {
565+ // analysis dependecy: live_var -> reference_safety -> reaching_def -> common_subexp_elimination
566+ pipeline. add_processor ( Box :: new ( LiveVarAnalysisProcessor :: new ( true ) ) ) ;
567+ pipeline. add_processor ( Box :: new ( FlushWritesProcessor { } ) ) ;
568+ if options. experiment_on ( Experiment :: REFERENCE_SAFETY_V3 ) {
569+ pipeline. add_processor ( Box :: new (
570+ reference_safety_processor_v3:: ReferenceSafetyProcessor { } ,
571+ ) ) ;
572+ } else {
573+ pipeline. add_processor ( Box :: new (
574+ reference_safety_processor_v2:: ReferenceSafetyProcessor { } ,
575+ ) ) ;
576+ }
577+ pipeline. add_processor ( Box :: new ( ReachingDefProcessor { } ) ) ;
578+ pipeline. add_processor ( Box :: new ( CommonSubexpElimination :: new ( true ) ) ) ;
579+ }
580+
559581 // Reference safety checkers need live variable annotation.
560582 pipeline. add_processor ( Box :: new ( LiveVarAnalysisProcessor :: new ( false ) ) ) ;
561583 if options. experiment_on ( Experiment :: REFERENCE_SAFETY_V3 ) {
0 commit comments