From d86eb784d65781849189b6ffb0d23404b6d1241e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=20K=C3=A5re=20Alsaker?= Date: Sun, 21 Jan 2018 19:46:14 +0100 Subject: [PATCH] Parallelize trans item collection --- src/librustc_mir/lib.rs | 3 ++ src/librustc_mir/monomorphize/collector.rs | 40 +++++++++++++--------- 2 files changed, 26 insertions(+), 17 deletions(-) diff --git a/src/librustc_mir/lib.rs b/src/librustc_mir/lib.rs index d815d4a7dba9..dc0d0b244633 100644 --- a/src/librustc_mir/lib.rs +++ b/src/librustc_mir/lib.rs @@ -34,7 +34,10 @@ Rust MIR: a lowered representation of Rust. Also: an experiment! #![feature(specialization)] #![feature(try_trait)] +#![recursion_limit="256"] + extern crate arena; + #[macro_use] extern crate bitflags; #[macro_use] extern crate log; diff --git a/src/librustc_mir/monomorphize/collector.rs b/src/librustc_mir/monomorphize/collector.rs index 1fb121728380..9e1223fe29cd 100644 --- a/src/librustc_mir/monomorphize/collector.rs +++ b/src/librustc_mir/monomorphize/collector.rs @@ -207,10 +207,12 @@ use rustc::mir::interpret::{Scalar, GlobalId, AllocType}; use monomorphize::{self, Instance}; use rustc::util::nodemap::{FxHashSet, FxHashMap, DefIdMap}; +use rustc::util::common::time; use monomorphize::item::{MonoItemExt, DefPathBasedNames, InstantiationMode}; use rustc_data_structures::bitvec::BitVector; +use rustc_data_structures::sync::{ParallelIterator, par_iter, Lock}; #[derive(PartialEq, Eq, Hash, Clone, Copy, Debug)] pub enum MonoItemCollectionMode { @@ -298,22 +300,26 @@ pub fn collect_crate_mono_items<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, mode: MonoItemCollectionMode) -> (FxHashSet>, InliningMap<'tcx>) { - let roots = collect_roots(tcx, mode); + let roots = time(tcx.sess, "collecting roots", || { + collect_roots(tcx, mode) + }); debug!("Building mono item graph, beginning at roots"); - let mut visited = FxHashSet(); - let mut recursion_depths = DefIdMap(); - let mut inlining_map = InliningMap::new(); + let visited = Lock::new(FxHashSet()); + let inlining_map = Lock::new(InliningMap::new()); - for root in roots { - collect_items_rec(tcx, - root, - &mut visited, - &mut recursion_depths, - &mut inlining_map); - } + time(tcx.sess, "collecting mono items", || { + par_iter(roots).for_each(|root| { + let mut recursion_depths = DefIdMap(); + collect_items_rec(tcx, + root, + &visited, + &mut recursion_depths, + &inlining_map); + }); + }); - (visited, inlining_map) + (visited.into_inner(), inlining_map.into_inner()) } // Find all non-generic items by walking the HIR. These items serve as roots to @@ -354,10 +360,10 @@ fn collect_roots<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, // Collect all monomorphized items reachable from `starting_point` fn collect_items_rec<'a, 'tcx: 'a>(tcx: TyCtxt<'a, 'tcx, 'tcx>, starting_point: MonoItem<'tcx>, - visited: &mut FxHashSet>, + visited: &Lock>>, recursion_depths: &mut DefIdMap, - inlining_map: &mut InliningMap<'tcx>) { - if !visited.insert(starting_point.clone()) { + inlining_map: &Lock>) { + if !visited.lock().insert(starting_point.clone()) { // We've been here already, no need to search again. return; } @@ -428,7 +434,7 @@ fn collect_items_rec<'a, 'tcx: 'a>(tcx: TyCtxt<'a, 'tcx, 'tcx>, fn record_accesses<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, caller: MonoItem<'tcx>, callees: &[MonoItem<'tcx>], - inlining_map: &mut InliningMap<'tcx>) { + inlining_map: &Lock>) { let is_inlining_candidate = |mono_item: &MonoItem<'tcx>| { mono_item.instantiation_mode(tcx) == InstantiationMode::LocalCopy }; @@ -438,7 +444,7 @@ fn record_accesses<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, (*mono_item, is_inlining_candidate(mono_item)) }); - inlining_map.record_accesses(caller, accesses); + inlining_map.lock().record_accesses(caller, accesses); } fn check_recursion_limit<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,