@@ -15,8 +15,9 @@ use rustc_attr as attr;
1515use rustc_data_structures:: fx:: FxHashMap ;
1616use rustc_data_structures:: profiling:: { get_resident_set_size, print_time_passes_entry} ;
1717
18+ use rustc_data_structures:: sync:: par_iter;
1819#[ cfg( parallel_compiler) ]
19- use rustc_data_structures:: sync:: { par_iter , ParallelIterator } ;
20+ use rustc_data_structures:: sync:: ParallelIterator ;
2021use rustc_hir as hir;
2122use rustc_hir:: def_id:: { DefId , LOCAL_CRATE } ;
2223use rustc_hir:: lang_items:: LangItem ;
@@ -607,6 +608,14 @@ pub fn codegen_crate<B: ExtraBackendMethods>(
607608 second_half. iter ( ) . rev ( ) . interleave ( first_half) . copied ( ) . collect ( )
608609 } ;
609610
611+ // Calculate the CGU reuse
612+ let cgu_reuse = tcx. sess . time ( "find_cgu_reuse" , || {
613+ codegen_units. iter ( ) . map ( |cgu| determine_cgu_reuse ( tcx, & cgu) ) . collect :: < Vec < _ > > ( )
614+ } ) ;
615+
616+ let mut total_codegen_time = Duration :: new ( 0 , 0 ) ;
617+ let start_rss = tcx. sess . time_passes ( ) . then ( || get_resident_set_size ( ) ) ;
618+
610619 // The non-parallel compiler can only translate codegen units to LLVM IR
611620 // on a single thread, leading to a staircase effect where the N LLVM
612621 // threads have to wait on the single codegen threads to generate work
@@ -617,8 +626,7 @@ pub fn codegen_crate<B: ExtraBackendMethods>(
617626 // This likely is a temporary measure. Once we don't have to support the
618627 // non-parallel compiler anymore, we can compile CGUs end-to-end in
619628 // parallel and get rid of the complicated scheduling logic.
620- #[ cfg( parallel_compiler) ]
621- let pre_compile_cgus = |cgu_reuse : & [ CguReuse ] | {
629+ let mut pre_compiled_cgus = if cfg ! ( parallel_compiler) {
622630 tcx. sess . time ( "compile_first_CGU_batch" , || {
623631 // Try to find one CGU to compile per thread.
624632 let cgus: Vec < _ > = cgu_reuse
@@ -638,48 +646,31 @@ pub fn codegen_crate<B: ExtraBackendMethods>(
638646 } )
639647 . collect ( ) ;
640648
641- ( pre_compiled_cgus, start_time. elapsed ( ) )
649+ total_codegen_time += start_time. elapsed ( ) ;
650+
651+ pre_compiled_cgus
642652 } )
653+ } else {
654+ FxHashMap :: default ( )
643655 } ;
644656
645- #[ cfg( not( parallel_compiler) ) ]
646- let pre_compile_cgus = |_: & [ CguReuse ] | ( FxHashMap :: default ( ) , Duration :: new ( 0 , 0 ) ) ;
647-
648- let mut cgu_reuse = Vec :: new ( ) ;
649- let mut pre_compiled_cgus: Option < FxHashMap < usize , _ > > = None ;
650- let mut total_codegen_time = Duration :: new ( 0 , 0 ) ;
651- let start_rss = tcx. sess . time_passes ( ) . then ( || get_resident_set_size ( ) ) ;
652-
653657 for ( i, cgu) in codegen_units. iter ( ) . enumerate ( ) {
654658 ongoing_codegen. wait_for_signal_to_codegen_item ( ) ;
655659 ongoing_codegen. check_for_errors ( tcx. sess ) ;
656660
657- // Do some setup work in the first iteration
658- if pre_compiled_cgus. is_none ( ) {
659- // Calculate the CGU reuse
660- cgu_reuse = tcx. sess . time ( "find_cgu_reuse" , || {
661- codegen_units. iter ( ) . map ( |cgu| determine_cgu_reuse ( tcx, & cgu) ) . collect ( )
662- } ) ;
663- // Pre compile some CGUs
664- let ( compiled_cgus, codegen_time) = pre_compile_cgus ( & cgu_reuse) ;
665- pre_compiled_cgus = Some ( compiled_cgus) ;
666- total_codegen_time += codegen_time;
667- }
668-
669661 let cgu_reuse = cgu_reuse[ i] ;
670662 tcx. sess . cgu_reuse_tracker . set_actual_reuse ( cgu. name ( ) . as_str ( ) , cgu_reuse) ;
671663
672664 match cgu_reuse {
673665 CguReuse :: No => {
674- let ( module, cost) =
675- if let Some ( cgu) = pre_compiled_cgus. as_mut ( ) . unwrap ( ) . remove ( & i) {
676- cgu
677- } else {
678- let start_time = Instant :: now ( ) ;
679- let module = backend. compile_codegen_unit ( tcx, cgu. name ( ) ) ;
680- total_codegen_time += start_time. elapsed ( ) ;
681- module
682- } ;
666+ let ( module, cost) = if let Some ( cgu) = pre_compiled_cgus. remove ( & i) {
667+ cgu
668+ } else {
669+ let start_time = Instant :: now ( ) ;
670+ let module = backend. compile_codegen_unit ( tcx, cgu. name ( ) ) ;
671+ total_codegen_time += start_time. elapsed ( ) ;
672+ module
673+ } ;
683674 // This will unwind if there are errors, which triggers our `AbortCodegenOnDrop`
684675 // guard. Unfortunately, just skipping the `submit_codegened_module_to_llvm` makes
685676 // compilation hang on post-monomorphization errors.
0 commit comments