Introduce MixedBitSet
.
It just uses `BitSet` for small/medium sizes (<= 2048 bits) and `ChunkedBitSet` for larger sizes. This is good because `ChunkedBitSet` is slow and memory-hungry at smaller sizes.
This commit is contained in:
parent
dff5ce6881
commit
6ee1a7aaa0
4 changed files with 200 additions and 3 deletions
|
@ -4,7 +4,7 @@
|
|||
use std::fmt;
|
||||
|
||||
use rustc_index::Idx;
|
||||
use rustc_index::bit_set::{BitSet, ChunkedBitSet};
|
||||
use rustc_index::bit_set::{BitSet, ChunkedBitSet, MixedBitSet};
|
||||
|
||||
use super::lattice::MaybeReachable;
|
||||
|
||||
|
@ -127,6 +127,26 @@ where
|
|||
}
|
||||
}
|
||||
|
||||
impl<T, C> DebugWithContext<C> for MixedBitSet<T>
|
||||
where
|
||||
T: Idx + DebugWithContext<C>,
|
||||
{
|
||||
fn fmt_with(&self, ctxt: &C, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
match self {
|
||||
MixedBitSet::Small(set) => set.fmt_with(ctxt, f),
|
||||
MixedBitSet::Large(set) => set.fmt_with(ctxt, f),
|
||||
}
|
||||
}
|
||||
|
||||
fn fmt_diff_with(&self, old: &Self, ctxt: &C, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
match (self, old) {
|
||||
(MixedBitSet::Small(set), MixedBitSet::Small(old)) => set.fmt_diff_with(old, ctxt, f),
|
||||
(MixedBitSet::Large(set), MixedBitSet::Large(old)) => set.fmt_diff_with(old, ctxt, f),
|
||||
_ => panic!("MixedBitSet size mismatch"),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<S, C> DebugWithContext<C> for MaybeReachable<S>
|
||||
where
|
||||
S: DebugWithContext<C>,
|
||||
|
|
|
@ -40,7 +40,7 @@
|
|||
|
||||
use std::iter;
|
||||
|
||||
use rustc_index::bit_set::{BitSet, ChunkedBitSet};
|
||||
use rustc_index::bit_set::{BitSet, ChunkedBitSet, MixedBitSet};
|
||||
use rustc_index::{Idx, IndexVec};
|
||||
|
||||
use crate::framework::BitSetExt;
|
||||
|
@ -132,6 +132,12 @@ impl<T: Idx> JoinSemiLattice for ChunkedBitSet<T> {
|
|||
}
|
||||
}
|
||||
|
||||
impl<T: Idx> JoinSemiLattice for MixedBitSet<T> {
|
||||
fn join(&mut self, other: &Self) -> bool {
|
||||
self.union(other)
|
||||
}
|
||||
}
|
||||
|
||||
/// Extends a type `T` with top and bottom elements to make it a partially ordered set in which no
|
||||
/// value of `T` is comparable with any other.
|
||||
///
|
||||
|
|
|
@ -35,7 +35,7 @@
|
|||
use std::cmp::Ordering;
|
||||
|
||||
use rustc_data_structures::work_queue::WorkQueue;
|
||||
use rustc_index::bit_set::{BitSet, ChunkedBitSet};
|
||||
use rustc_index::bit_set::{BitSet, ChunkedBitSet, MixedBitSet};
|
||||
use rustc_index::{Idx, IndexVec};
|
||||
use rustc_middle::bug;
|
||||
use rustc_middle::mir::{self, BasicBlock, CallReturnPlaces, Location, TerminatorEdges, traversal};
|
||||
|
@ -77,6 +77,12 @@ impl<T: Idx> BitSetExt<T> for ChunkedBitSet<T> {
|
|||
}
|
||||
}
|
||||
|
||||
impl<T: Idx> BitSetExt<T> for MixedBitSet<T> {
|
||||
fn contains(&self, elem: T) -> bool {
|
||||
self.contains(elem)
|
||||
}
|
||||
}
|
||||
|
||||
/// A dataflow problem with an arbitrarily complex transfer function.
|
||||
///
|
||||
/// This trait specifies the lattice on which this analysis operates (the domain), its
|
||||
|
@ -337,6 +343,16 @@ impl<T: Idx> GenKill<T> for ChunkedBitSet<T> {
|
|||
}
|
||||
}
|
||||
|
||||
impl<T: Idx> GenKill<T> for MixedBitSet<T> {
|
||||
fn gen_(&mut self, elem: T) {
|
||||
self.insert(elem);
|
||||
}
|
||||
|
||||
fn kill(&mut self, elem: T) {
|
||||
self.remove(elem);
|
||||
}
|
||||
}
|
||||
|
||||
impl<T, S: GenKill<T>> GenKill<T> for MaybeReachable<S> {
|
||||
fn gen_(&mut self, elem: T) {
|
||||
match self {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue