Rollup merge of #133475 - nnethercote:MaybeStorage-improvements, r=lcnr
`MaybeStorage` improvements Minor dataflow improvements. r? `@tmiasko`
This commit is contained in:
commit
219b2a010d
9 changed files with 29 additions and 38 deletions
|
@ -14,4 +14,6 @@ pub use self::initialized::{
|
|||
pub use self::liveness::{
|
||||
MaybeLiveLocals, MaybeTransitiveLiveLocals, TransferFunction as LivenessTransferFunction,
|
||||
};
|
||||
pub use self::storage_liveness::{MaybeRequiresStorage, MaybeStorageDead, MaybeStorageLive};
|
||||
pub use self::storage_liveness::{
|
||||
MaybeRequiresStorage, MaybeStorageDead, MaybeStorageLive, always_storage_live_locals,
|
||||
};
|
||||
|
|
|
@ -7,6 +7,23 @@ use rustc_middle::mir::*;
|
|||
use super::MaybeBorrowedLocals;
|
||||
use crate::{Analysis, GenKill, ResultsCursor};
|
||||
|
||||
/// The set of locals in a MIR body that do not have `StorageLive`/`StorageDead` annotations.
|
||||
///
|
||||
/// These locals have fixed storage for the duration of the body.
|
||||
pub fn always_storage_live_locals(body: &Body<'_>) -> BitSet<Local> {
|
||||
let mut always_live_locals = BitSet::new_filled(body.local_decls.len());
|
||||
|
||||
for block in &*body.basic_blocks {
|
||||
for statement in &block.statements {
|
||||
if let StatementKind::StorageLive(l) | StatementKind::StorageDead(l) = statement.kind {
|
||||
always_live_locals.remove(l);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
always_live_locals
|
||||
}
|
||||
|
||||
pub struct MaybeStorageLive<'a> {
|
||||
always_live_locals: Cow<'a, BitSet<Local>>,
|
||||
}
|
||||
|
@ -28,10 +45,7 @@ impl<'a, 'tcx> Analysis<'tcx> for MaybeStorageLive<'a> {
|
|||
}
|
||||
|
||||
fn initialize_start_block(&self, body: &Body<'tcx>, on_entry: &mut Self::Domain) {
|
||||
assert_eq!(body.local_decls.len(), self.always_live_locals.domain_size());
|
||||
for local in self.always_live_locals.iter() {
|
||||
on_entry.insert(local);
|
||||
}
|
||||
on_entry.union(&*self.always_live_locals);
|
||||
|
||||
for arg in body.args_iter() {
|
||||
on_entry.insert(arg);
|
||||
|
|
|
@ -25,7 +25,7 @@ pub use self::framework::{
|
|||
use self::move_paths::MoveData;
|
||||
|
||||
pub mod debuginfo;
|
||||
pub mod drop_flag_effects;
|
||||
mod drop_flag_effects;
|
||||
pub mod elaborate_drops;
|
||||
mod errors;
|
||||
mod framework;
|
||||
|
@ -33,8 +33,7 @@ pub mod impls;
|
|||
pub mod move_paths;
|
||||
pub mod points;
|
||||
pub mod rustc_peek;
|
||||
pub mod storage;
|
||||
pub mod un_derefer;
|
||||
mod un_derefer;
|
||||
pub mod value_analysis;
|
||||
|
||||
rustc_fluent_macro::fluent_messages! { "../messages.ftl" }
|
||||
|
|
|
@ -1,20 +0,0 @@
|
|||
use rustc_index::bit_set::BitSet;
|
||||
use rustc_middle::mir::{self, Local};
|
||||
|
||||
/// The set of locals in a MIR body that do not have `StorageLive`/`StorageDead` annotations.
|
||||
///
|
||||
/// These locals have fixed storage for the duration of the body.
|
||||
pub fn always_storage_live_locals(body: &mir::Body<'_>) -> BitSet<Local> {
|
||||
let mut always_live_locals = BitSet::new_filled(body.local_decls.len());
|
||||
|
||||
for block in &*body.basic_blocks {
|
||||
for statement in &block.statements {
|
||||
use mir::StatementKind::{StorageDead, StorageLive};
|
||||
if let StorageLive(l) | StorageDead(l) = statement.kind {
|
||||
always_live_locals.remove(l);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
always_live_locals
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue