Skip to content
This repository was archived by the owner on May 28, 2025. It is now read-only.

Commit 2110ac3

Browse files
committed
Add optimized sparse-hybrid / dense-hybrid intersect
1 parent 415d5e8 commit 2110ac3

File tree

1 file changed

+21
-6
lines changed

1 file changed

+21
-6
lines changed

compiler/rustc_index/src/bit_set.rs

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,16 @@ fn sparse_intersect<T: Idx>(
267267
set.elems.len() != size
268268
}
269269

270+
fn dense_sparse_intersect<T: Idx>(
271+
dense: &BitSet<T>,
272+
sparse: &SparseBitSet<T>,
273+
) -> (SparseBitSet<T>, bool) {
274+
let n = dense.count();
275+
let mut sparse_copy = sparse.clone();
276+
sparse_intersect(&mut sparse_copy, |el| !dense.contains(*el));
277+
(sparse_copy, dense.count() != n)
278+
}
279+
270280
impl<T: Idx> BitRelations<HybridBitSet<T>> for BitSet<T> {
271281
fn union(&mut self, other: &HybridBitSet<T>) -> bool {
272282
assert_eq!(self.domain_size, other.domain_size());
@@ -292,11 +302,9 @@ impl<T: Idx> BitRelations<HybridBitSet<T>> for BitSet<T> {
292302
assert_eq!(self.domain_size, other.domain_size());
293303
match other {
294304
HybridBitSet::Sparse(sparse) => {
295-
let n = self.count();
296-
let mut sparse_copy = sparse.clone();
297-
sparse_intersect(&mut sparse_copy, |el| !self.contains(*el));
298-
*self = sparse_copy.to_dense();
299-
self.count() != n
305+
let (updated, changed) = dense_sparse_intersect(self, sparse);
306+
*self = updated.to_dense();
307+
changed
300308
}
301309
HybridBitSet::Dense(dense) => self.intersect(dense),
302310
}
@@ -364,7 +372,14 @@ impl<T: Idx> BitRelations<HybridBitSet<T>> for HybridBitSet<T> {
364372
HybridBitSet::Sparse(self_sparse) => {
365373
sparse_intersect(self_sparse, |elem| other.contains(*elem))
366374
}
367-
HybridBitSet::Dense(self_dense) => self_dense.intersect(other),
375+
HybridBitSet::Dense(self_dense) => match other {
376+
HybridBitSet::Sparse(other_sparse) => {
377+
let (updated, changed) = dense_sparse_intersect(self_dense, other_sparse);
378+
*self = HybridBitSet::Sparse(updated);
379+
changed
380+
}
381+
HybridBitSet::Dense(other_dense) => self_dense.intersect(other_dense),
382+
},
368383
}
369384
}
370385
}

0 commit comments

Comments
 (0)