@@ -20,6 +20,7 @@ use rustc::session::search_paths::PathKind;
20
20
use rustc:: lint;
21
21
use rustc:: middle:: { self , dependency_format, stability, reachable} ;
22
22
use rustc:: middle:: privacy:: AccessLevels ;
23
+ use rustc:: mir:: transform:: { MIR_CONST , MIR_VALIDATED , MIR_OPTIMIZED } ;
23
24
use rustc:: ty:: { self , TyCtxt , Resolutions , GlobalArenas } ;
24
25
use rustc:: util:: common:: time;
25
26
use rustc:: util:: nodemap:: NodeSet ;
@@ -903,9 +904,43 @@ pub fn phase_3_run_analysis_passes<'tcx, F, R>(sess: &'tcx Session,
903
904
// FIXME(eddyb) get rid of this once we replace const_eval with miri.
904
905
rustc_const_eval:: provide ( & mut extern_providers) ;
905
906
907
+ // Setup the MIR passes that we want to run.
908
+ let mut passes = sess. mir_passes . borrow ( ) . clone ( ) ;
909
+ passes. push_hook ( mir:: transform:: dump_mir:: DumpMir ) ;
910
+
911
+ // What we need to do constant evaluation.
912
+ passes. push_pass ( MIR_CONST , mir:: transform:: simplify:: SimplifyCfg :: new ( "initial" ) ) ;
913
+ passes. push_pass ( MIR_CONST , mir:: transform:: type_check:: TypeckMir ) ;
914
+
915
+ // What we need to run borrowck etc.
916
+ passes. push_pass ( MIR_VALIDATED , mir:: transform:: qualify_consts:: QualifyAndPromoteConstants ) ;
917
+ passes. push_pass ( MIR_VALIDATED , mir:: transform:: simplify_branches:: SimplifyBranches :: new ( "initial" ) ) ;
918
+ passes. push_pass ( MIR_VALIDATED , mir:: transform:: simplify:: SimplifyCfg :: new ( "qualify-consts" ) ) ;
919
+
920
+ // Optimizations begin.
921
+ passes. push_pass ( MIR_OPTIMIZED , mir:: transform:: no_landing_pads:: NoLandingPads ) ;
922
+ passes. push_pass ( MIR_OPTIMIZED , mir:: transform:: simplify:: SimplifyCfg :: new ( "no-landing-pads" ) ) ;
923
+
924
+ // From here on out, regions are gone.
925
+ passes. push_pass ( MIR_OPTIMIZED , mir:: transform:: erase_regions:: EraseRegions ) ;
926
+ passes. push_pass ( MIR_OPTIMIZED , mir:: transform:: add_call_guards:: AddCallGuards ) ;
927
+ passes. push_pass ( MIR_OPTIMIZED , borrowck:: ElaborateDrops ) ;
928
+ passes. push_pass ( MIR_OPTIMIZED , mir:: transform:: no_landing_pads:: NoLandingPads ) ;
929
+ passes. push_pass ( MIR_OPTIMIZED , mir:: transform:: simplify:: SimplifyCfg :: new ( "elaborate-drops" ) ) ;
930
+
931
+ // No lifetime analysis based on borrowing can be done from here on out.
932
+ passes. push_pass ( MIR_OPTIMIZED , mir:: transform:: inline:: Inline ) ;
933
+ passes. push_pass ( MIR_OPTIMIZED , mir:: transform:: instcombine:: InstCombine ) ;
934
+ passes. push_pass ( MIR_OPTIMIZED , mir:: transform:: deaggregator:: Deaggregator ) ;
935
+ passes. push_pass ( MIR_OPTIMIZED , mir:: transform:: copy_prop:: CopyPropagation ) ;
936
+ passes. push_pass ( MIR_OPTIMIZED , mir:: transform:: simplify:: SimplifyLocals ) ;
937
+ passes. push_pass ( MIR_OPTIMIZED , mir:: transform:: add_call_guards:: AddCallGuards ) ;
938
+ passes. push_pass ( MIR_OPTIMIZED , mir:: transform:: dump_mir:: Marker ( "PreTrans" ) ) ;
939
+
906
940
TyCtxt :: create_and_enter ( sess,
907
941
local_providers,
908
942
extern_providers,
943
+ Rc :: new ( passes) ,
909
944
arenas,
910
945
arena,
911
946
resolutions,
@@ -971,18 +1006,8 @@ pub fn phase_3_run_analysis_passes<'tcx, F, R>(sess: &'tcx Session,
971
1006
}
972
1007
973
1008
time ( time_passes, "MIR cleanup and validation" , || {
974
- let mut passes = sess. mir_passes . borrow_mut ( ) ;
975
- // Push all the built-in validation passes.
976
- // NB: if you’re adding an *optimisation* it ought to go to another set of passes
977
- // in stage 4 below.
978
- passes. push_hook ( mir:: transform:: dump_mir:: DumpMir ) ;
979
- passes. push_pass ( mir:: transform:: simplify:: SimplifyCfg :: new ( "initial" ) ) ;
980
- passes. push_pass ( mir:: transform:: type_check:: TypeckMir ) ;
981
- passes. push_pass ( mir:: transform:: qualify_consts:: QualifyAndPromoteConstants ) ;
982
- passes. push_pass ( mir:: transform:: simplify_branches:: SimplifyBranches :: new ( "initial" ) ) ;
983
- passes. push_pass ( mir:: transform:: simplify:: SimplifyCfg :: new ( "qualify-consts" ) ) ;
984
- // And run everything.
985
- passes. run_passes ( tcx) ;
1009
+ tcx. mir_passes . run_passes ( tcx, MIR_CONST ) ;
1010
+ tcx. mir_passes . run_passes ( tcx, MIR_VALIDATED ) ;
986
1011
} ) ;
987
1012
988
1013
time ( time_passes,
@@ -1040,30 +1065,7 @@ pub fn phase_4_translate_to_llvm<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
1040
1065
// Run the passes that transform the MIR into a more suitable form for translation to LLVM
1041
1066
// code.
1042
1067
time ( time_passes, "MIR optimisations" , || {
1043
- let mut passes = :: rustc:: mir:: transform:: Passes :: new ( ) ;
1044
- passes. push_hook ( mir:: transform:: dump_mir:: DumpMir ) ;
1045
- passes. push_pass ( mir:: transform:: no_landing_pads:: NoLandingPads ) ;
1046
- passes. push_pass ( mir:: transform:: simplify:: SimplifyCfg :: new ( "no-landing-pads" ) ) ;
1047
-
1048
- // From here on out, regions are gone.
1049
- passes. push_pass ( mir:: transform:: erase_regions:: EraseRegions ) ;
1050
-
1051
- passes. push_pass ( mir:: transform:: add_call_guards:: AddCallGuards ) ;
1052
- passes. push_pass ( borrowck:: ElaborateDrops ) ;
1053
- passes. push_pass ( mir:: transform:: no_landing_pads:: NoLandingPads ) ;
1054
- passes. push_pass ( mir:: transform:: simplify:: SimplifyCfg :: new ( "elaborate-drops" ) ) ;
1055
-
1056
- // No lifetime analysis based on borrowing can be done from here on out.
1057
- passes. push_pass ( mir:: transform:: inline:: Inline ) ;
1058
- passes. push_pass ( mir:: transform:: instcombine:: InstCombine ) ;
1059
- passes. push_pass ( mir:: transform:: deaggregator:: Deaggregator ) ;
1060
- passes. push_pass ( mir:: transform:: copy_prop:: CopyPropagation ) ;
1061
-
1062
- passes. push_pass ( mir:: transform:: simplify:: SimplifyLocals ) ;
1063
- passes. push_pass ( mir:: transform:: add_call_guards:: AddCallGuards ) ;
1064
- passes. push_pass ( mir:: transform:: dump_mir:: Marker ( "PreTrans" ) ) ;
1065
-
1066
- passes. run_passes ( tcx) ;
1068
+ tcx. mir_passes . run_passes ( tcx, MIR_OPTIMIZED ) ;
1067
1069
} ) ;
1068
1070
1069
1071
if tcx. sess . opts . debugging_opts . mir_stats {
0 commit comments