about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJohn Kåre Alsaker <john.kare.alsaker@gmail.com>2019-12-31 14:01:38 +0100
committerJohn Kåre Alsaker <john.kare.alsaker@gmail.com>2020-01-11 00:33:27 +0100
commitf3ce14479c5297521edfe70c8e4ef7c6d1a83536 (patch)
treedab9694a9433534a25a8ce72d39fd6a61c9d31c2
parentac6eb0db01a781d4f4940b34bd4c1cbe7e75263a (diff)
downloadrust-f3ce14479c5297521edfe70c8e4ef7c6d1a83536.tar.gz
rust-f3ce14479c5297521edfe70c8e4ef7c6d1a83536.zip
Run codegen unit partitioning and assert_symbols_are_distinct in parallel
-rw-r--r--src/librustc_mir/monomorphize/partitioning.rs32
1 files changed, 20 insertions, 12 deletions
diff --git a/src/librustc_mir/monomorphize/partitioning.rs b/src/librustc_mir/monomorphize/partitioning.rs
index 8fa41cab190..0def51a6a33 100644
--- a/src/librustc_mir/monomorphize/partitioning.rs
+++ b/src/librustc_mir/monomorphize/partitioning.rs
@@ -104,6 +104,7 @@ use rustc::ty::print::characteristic_def_id_of_type;
 use rustc::ty::query::Providers;
 use rustc::ty::{self, DefIdTree, InstanceDef, TyCtxt};
 use rustc_data_structures::fx::{FxHashMap, FxHashSet};
+use rustc_data_structures::sync;
 use rustc_hir::def::DefKind;
 use rustc_hir::def_id::{CrateNum, DefId, DefIdSet, CRATE_DEF_INDEX, LOCAL_CRATE};
 use rustc_span::symbol::Symbol;
@@ -796,6 +797,8 @@ where
     I: Iterator<Item = &'a MonoItem<'tcx>>,
     'tcx: 'a,
 {
+    let _prof_timer = tcx.prof.generic_activity("assert_symbols_are_distinct");
+
     let mut symbols: Vec<_> =
         mono_items.map(|mono_item| (mono_item, mono_item.symbol_name(tcx))).collect();
 
@@ -869,18 +872,23 @@ fn collect_and_partition_mono_items(
 
     tcx.sess.abort_if_errors();
 
-    assert_symbols_are_distinct(tcx, items.iter());
-
-    let strategy = if tcx.sess.opts.incremental.is_some() {
-        PartitioningStrategy::PerModule
-    } else {
-        PartitioningStrategy::FixedUnitCount(tcx.sess.codegen_units())
-    };
-
-    let codegen_units = partition(tcx, items.iter().cloned(), strategy, &inlining_map)
-        .into_iter()
-        .map(Arc::new)
-        .collect::<Vec<_>>();
+    let (codegen_units, _) = tcx.sess.time("partition_and_assert_distinct_symbols", || {
+        sync::join(
+            || {
+                let strategy = if tcx.sess.opts.incremental.is_some() {
+                    PartitioningStrategy::PerModule
+                } else {
+                    PartitioningStrategy::FixedUnitCount(tcx.sess.codegen_units())
+                };
+
+                partition(tcx, items.iter().cloned(), strategy, &inlining_map)
+                    .into_iter()
+                    .map(Arc::new)
+                    .collect::<Vec<_>>()
+            },
+            || assert_symbols_are_distinct(tcx, items.iter()),
+        )
+    });
 
     let mono_items: DefIdSet = items
         .iter()