Use a plain bitset for liveness analyses.
This commit is contained in:
parent
7e64de431e
commit
e07ffe97b8
@ -305,7 +305,10 @@ fn update_bits(
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx> AnalysisDomain<'tcx> for MaybeInitializedPlaces<'_, 'tcx> {
|
impl<'tcx> AnalysisDomain<'tcx> for MaybeInitializedPlaces<'_, 'tcx> {
|
||||||
|
/// There can be many more `MovePathIndex` than there are locals in a MIR body.
|
||||||
|
/// We use a chunked bitset to avoid paying too high a memory footprint.
|
||||||
type Domain = MaybeReachable<ChunkedBitSet<MovePathIndex>>;
|
type Domain = MaybeReachable<ChunkedBitSet<MovePathIndex>>;
|
||||||
|
|
||||||
const NAME: &'static str = "maybe_init";
|
const NAME: &'static str = "maybe_init";
|
||||||
|
|
||||||
fn bottom_value(&self, _: &mir::Body<'tcx>) -> Self::Domain {
|
fn bottom_value(&self, _: &mir::Body<'tcx>) -> Self::Domain {
|
||||||
@ -437,6 +440,8 @@ fn switch_int_edge_effects<G: GenKill<Self::Idx>>(
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx> AnalysisDomain<'tcx> for MaybeUninitializedPlaces<'_, 'tcx> {
|
impl<'tcx> AnalysisDomain<'tcx> for MaybeUninitializedPlaces<'_, 'tcx> {
|
||||||
|
/// There can be many more `MovePathIndex` than there are locals in a MIR body.
|
||||||
|
/// We use a chunked bitset to avoid paying too high a memory footprint.
|
||||||
type Domain = ChunkedBitSet<MovePathIndex>;
|
type Domain = ChunkedBitSet<MovePathIndex>;
|
||||||
|
|
||||||
const NAME: &'static str = "maybe_uninit";
|
const NAME: &'static str = "maybe_uninit";
|
||||||
@ -636,6 +641,8 @@ fn call_return_effect(
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx> AnalysisDomain<'tcx> for EverInitializedPlaces<'_, 'tcx> {
|
impl<'tcx> AnalysisDomain<'tcx> for EverInitializedPlaces<'_, 'tcx> {
|
||||||
|
/// There can be many more `InitIndex` than there are locals in a MIR body.
|
||||||
|
/// We use a chunked bitset to avoid paying too high a memory footprint.
|
||||||
type Domain = ChunkedBitSet<InitIndex>;
|
type Domain = ChunkedBitSet<InitIndex>;
|
||||||
|
|
||||||
const NAME: &'static str = "ever_init";
|
const NAME: &'static str = "ever_init";
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
use rustc_index::bit_set::{BitSet, ChunkedBitSet};
|
use rustc_index::bit_set::BitSet;
|
||||||
use rustc_middle::mir::visit::{MutatingUseContext, NonMutatingUseContext, PlaceContext, Visitor};
|
use rustc_middle::mir::visit::{MutatingUseContext, NonMutatingUseContext, PlaceContext, Visitor};
|
||||||
use rustc_middle::mir::{
|
use rustc_middle::mir::{
|
||||||
self, CallReturnPlaces, Local, Location, Place, StatementKind, TerminatorEdges,
|
self, CallReturnPlaces, Local, Location, Place, StatementKind, TerminatorEdges,
|
||||||
@ -26,14 +26,14 @@
|
|||||||
pub struct MaybeLiveLocals;
|
pub struct MaybeLiveLocals;
|
||||||
|
|
||||||
impl<'tcx> AnalysisDomain<'tcx> for MaybeLiveLocals {
|
impl<'tcx> AnalysisDomain<'tcx> for MaybeLiveLocals {
|
||||||
type Domain = ChunkedBitSet<Local>;
|
type Domain = BitSet<Local>;
|
||||||
type Direction = Backward;
|
type Direction = Backward;
|
||||||
|
|
||||||
const NAME: &'static str = "liveness";
|
const NAME: &'static str = "liveness";
|
||||||
|
|
||||||
fn bottom_value(&self, body: &mir::Body<'tcx>) -> Self::Domain {
|
fn bottom_value(&self, body: &mir::Body<'tcx>) -> Self::Domain {
|
||||||
// bottom = not live
|
// bottom = not live
|
||||||
ChunkedBitSet::new_empty(body.local_decls.len())
|
BitSet::new_empty(body.local_decls.len())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn initialize_start_block(&self, _: &mir::Body<'tcx>, _: &mut Self::Domain) {
|
fn initialize_start_block(&self, _: &mir::Body<'tcx>, _: &mut Self::Domain) {
|
||||||
@ -233,14 +233,14 @@ pub fn new(always_live: &'a BitSet<Local>) -> Self {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, 'tcx> AnalysisDomain<'tcx> for MaybeTransitiveLiveLocals<'a> {
|
impl<'a, 'tcx> AnalysisDomain<'tcx> for MaybeTransitiveLiveLocals<'a> {
|
||||||
type Domain = ChunkedBitSet<Local>;
|
type Domain = BitSet<Local>;
|
||||||
type Direction = Backward;
|
type Direction = Backward;
|
||||||
|
|
||||||
const NAME: &'static str = "transitive liveness";
|
const NAME: &'static str = "transitive liveness";
|
||||||
|
|
||||||
fn bottom_value(&self, body: &mir::Body<'tcx>) -> Self::Domain {
|
fn bottom_value(&self, body: &mir::Body<'tcx>) -> Self::Domain {
|
||||||
// bottom = not live
|
// bottom = not live
|
||||||
ChunkedBitSet::new_empty(body.local_decls.len())
|
BitSet::new_empty(body.local_decls.len())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn initialize_start_block(&self, _: &mir::Body<'tcx>, _: &mut Self::Domain) {
|
fn initialize_start_block(&self, _: &mir::Body<'tcx>, _: &mut Self::Domain) {
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
use crate::framework::{visit_results, ResultsVisitable, ResultsVisitor};
|
use crate::framework::{visit_results, ResultsVisitable, ResultsVisitor};
|
||||||
use rustc_index::bit_set::ChunkedBitSet;
|
use rustc_index::bit_set::BitSet;
|
||||||
use rustc_index::interval::SparseIntervalMatrix;
|
use rustc_index::interval::SparseIntervalMatrix;
|
||||||
use rustc_index::Idx;
|
use rustc_index::Idx;
|
||||||
use rustc_index::IndexVec;
|
use rustc_index::IndexVec;
|
||||||
@ -102,7 +102,7 @@ pub fn save_as_intervals<'tcx, N, R>(
|
|||||||
) -> SparseIntervalMatrix<N, PointIndex>
|
) -> SparseIntervalMatrix<N, PointIndex>
|
||||||
where
|
where
|
||||||
N: Idx,
|
N: Idx,
|
||||||
R: ResultsVisitable<'tcx, FlowState = ChunkedBitSet<N>>,
|
R: ResultsVisitable<'tcx, FlowState = BitSet<N>>,
|
||||||
{
|
{
|
||||||
let values = SparseIntervalMatrix::new(elements.num_points());
|
let values = SparseIntervalMatrix::new(elements.num_points());
|
||||||
let mut visitor = Visitor { elements, values };
|
let mut visitor = Visitor { elements, values };
|
||||||
@ -124,7 +124,7 @@ impl<'mir, 'tcx, R, N> ResultsVisitor<'mir, 'tcx, R> for Visitor<'_, N>
|
|||||||
where
|
where
|
||||||
N: Idx,
|
N: Idx,
|
||||||
{
|
{
|
||||||
type FlowState = ChunkedBitSet<N>;
|
type FlowState = BitSet<N>;
|
||||||
|
|
||||||
fn visit_statement_after_primary_effect(
|
fn visit_statement_after_primary_effect(
|
||||||
&mut self,
|
&mut self,
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
use crate::{Analysis, JoinSemiLattice, ResultsCursor};
|
use crate::{Analysis, JoinSemiLattice, ResultsCursor};
|
||||||
use rustc_ast::MetaItem;
|
use rustc_ast::MetaItem;
|
||||||
use rustc_hir::def_id::DefId;
|
use rustc_hir::def_id::DefId;
|
||||||
use rustc_index::bit_set::ChunkedBitSet;
|
use rustc_index::bit_set::BitSet;
|
||||||
use rustc_middle::mir::MirPass;
|
use rustc_middle::mir::MirPass;
|
||||||
use rustc_middle::mir::{self, Body, Local, Location};
|
use rustc_middle::mir::{self, Body, Local, Location};
|
||||||
use rustc_middle::ty::{self, Ty, TyCtxt};
|
use rustc_middle::ty::{self, Ty, TyCtxt};
|
||||||
@ -275,7 +275,7 @@ fn peek_at(
|
|||||||
&self,
|
&self,
|
||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
place: mir::Place<'tcx>,
|
place: mir::Place<'tcx>,
|
||||||
flow_state: &ChunkedBitSet<Local>,
|
flow_state: &BitSet<Local>,
|
||||||
call: PeekCall,
|
call: PeekCall,
|
||||||
) {
|
) {
|
||||||
info!(?place, "peek_at");
|
info!(?place, "peek_at");
|
||||||
|
Loading…
Reference in New Issue
Block a user