From f93cbf617000673e5ad2fc0fd0eff0c9ea229314 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sat, 22 Dec 2018 12:41:17 +0100 Subject: [PATCH] Short-circuit DefIdForest::intersection() If the forest is already empty, there is no point in intersecting further. Also handle the first element separately, so we don't compute an unnecessary intersection between the full forest and the first element, which is always equal to the first element. --- src/librustc/ty/inhabitedness/def_id_forest.rs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/librustc/ty/inhabitedness/def_id_forest.rs b/src/librustc/ty/inhabitedness/def_id_forest.rs index 163263babf899..af2185205a33d 100644 --- a/src/librustc/ty/inhabitedness/def_id_forest.rs +++ b/src/librustc/ty/inhabitedness/def_id_forest.rs @@ -74,10 +74,21 @@ impl<'a, 'gcx, 'tcx> DefIdForest { iter: I) -> DefIdForest where I: IntoIterator { - let mut ret = DefIdForest::full(tcx); + let mut iter = iter.into_iter(); + let mut ret = if let Some(first) = iter.next() { + first + } else { + return DefIdForest::full(tcx); + }; + let mut next_ret = SmallVec::new(); let mut old_ret: SmallVec<[DefId; 1]> = SmallVec::new(); for next_forest in iter { + // No need to continue if the intersection is already empty. + if ret.is_empty() { + break; + } + for id in ret.root_ids.drain() { if next_forest.contains(tcx, id) { next_ret.push(id);