Auto merge of #103214 - Nilstrieb:set-theory, r=petrochenkov

Use Set instead of Vec in transitive_relation

Helps with #103195. It doesn't fix the underlying quadraticness but it makes it _a lot_ faster to an extent where even doubling the amount of nested references still takes less than two seconds (50s on nightly).

I want to see whether this causes regressions (because the vec was usually quite small) or improvements (as lookup for bigger sets is now much faster) in real code.
This commit is contained in:
bors 2022-10-19 13:53:06 +00:00
commit 4b8f431995

View File

@ -1,5 +1,5 @@
use crate::frozen::Frozen;
use crate::fx::FxIndexSet;
use crate::fx::{FxHashSet, FxIndexSet};
use rustc_index::bit_set::BitMatrix;
use std::fmt::Debug;
use std::hash::Hash;
@ -16,7 +16,7 @@ pub struct TransitiveRelationBuilder<T> {
// List of base edges in the graph. Require to compute transitive
// closure.
edges: Vec<Edge>,
edges: FxHashSet<Edge>,
}
#[derive(Debug)]
@ -52,10 +52,10 @@ impl<T: Eq + Hash> Default for TransitiveRelationBuilder<T> {
}
}
#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Debug)]
#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Debug, Hash)]
struct Index(usize);
#[derive(Clone, PartialEq, Eq, Debug)]
#[derive(Clone, PartialEq, Eq, Debug, Hash)]
struct Edge {
source: Index,
target: Index,
@ -99,9 +99,7 @@ impl<T: Eq + Hash + Copy> TransitiveRelationBuilder<T> {
let a = self.add_index(a);
let b = self.add_index(b);
let edge = Edge { source: a, target: b };
if !self.edges.contains(&edge) {
self.edges.push(edge);
}
self.edges.insert(edge);
}
/// Compute the transitive closure derived from the edges, and converted to