Struct rustc_mir_transform::ssa::SsaLocals
source · pub struct SsaLocals {
assignments: IndexVec<Local, Set1<DefLocation>>,
assignment_order: Vec<Local>,
copy_classes: IndexVec<Local, Local>,
direct_uses: IndexVec<Local, u32>,
borrowed_locals: BitSet<Local>,
}
Fields§
§assignments: IndexVec<Local, Set1<DefLocation>>
Assignments to each local. This defines whether the local is SSA.
assignment_order: Vec<Local>
We visit the body in reverse postorder, to ensure each local is assigned before it is used. We remember the order in which we saw the assignments to compute the SSA values in a single pass.
copy_classes: IndexVec<Local, Local>
Copy equivalence classes between locals. See copy_classes
for documentation.
direct_uses: IndexVec<Local, u32>
Number of “direct” uses of each local, ie. uses that are not dereferences. We ignore non-uses (Storage statements, debuginfo).
borrowed_locals: BitSet<Local>
Set of SSA locals that are immutably borrowed.
Implementations§
source§impl SsaLocals
impl SsaLocals
pub fn new<'tcx>( tcx: TyCtxt<'tcx>, body: &Body<'tcx>, param_env: ParamEnv<'tcx>, ) -> SsaLocals
pub fn num_locals(&self) -> usize
pub fn locals(&self) -> impl Iterator<Item = Local>
pub fn is_ssa(&self, local: Local) -> bool
sourcepub fn num_direct_uses(&self, local: Local) -> u32
pub fn num_direct_uses(&self, local: Local) -> u32
Return the number of uses if a local that are not “Deref”.
pub fn assignment_dominates( &self, dominators: &Dominators<BasicBlock>, local: Local, location: Location, ) -> bool
pub fn assignments<'a, 'tcx>( &'a self, body: &'a Body<'tcx>, ) -> impl Iterator<Item = (Local, &'a Rvalue<'tcx>, Location)> + 'a
pub fn for_each_assignment_mut<'tcx>( &self, basic_blocks: &mut IndexSlice<BasicBlock, BasicBlockData<'tcx>>, f: impl FnMut(Local, AssignedValue<'_, 'tcx>, Location), )
sourcepub fn copy_classes(&self) -> &IndexSlice<Local, Local>
pub fn copy_classes(&self) -> &IndexSlice<Local, Local>
Compute the equivalence classes for locals, based on copy statements.
The returned vector maps each local to the one it copies. In the following case: _a = &mut _0 _b = move? _a _c = move? _a _d = move? _c We return the mapping _a => _a // not a copy so, represented by itself _b => _a _c => _a _d => _a // transitively through _c
Exception: we do not see through the return place, as it cannot be instantiated.
sourcepub fn borrowed_locals(&self) -> &BitSet<Local>
pub fn borrowed_locals(&self) -> &BitSet<Local>
Set of SSA locals that are immutably borrowed.
sourcepub fn meet_copy_equivalence(&self, property: &mut BitSet<Local>)
pub fn meet_copy_equivalence(&self, property: &mut BitSet<Local>)
Make a property uniform on a copy equivalence class by removing elements.
Auto Trait Implementations§
impl Freeze for SsaLocals
impl RefUnwindSafe for SsaLocals
impl Send for SsaLocals
impl Sync for SsaLocals
impl Unpin for SsaLocals
impl UnwindSafe for SsaLocals
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
source§impl<T, R> CollectAndApply<T, R> for T
impl<T, R> CollectAndApply<T, R> for T
source§impl<T> Filterable for T
impl<T> Filterable for T
source§fn filterable(
self,
filter_name: &'static str,
) -> RequestFilterDataProvider<T, fn(_: DataRequest<'_>) -> bool>
fn filterable( self, filter_name: &'static str, ) -> RequestFilterDataProvider<T, fn(_: DataRequest<'_>) -> bool>
source§impl<T> Instrument for T
impl<T> Instrument for T
source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
source§impl<T> IntoEither for T
impl<T> IntoEither for T
source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moresource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moresource§impl<P> IntoQueryParam<P> for P
impl<P> IntoQueryParam<P> for P
fn into_query_param(self) -> P
source§impl<T> MaybeResult<T> for T
impl<T> MaybeResult<T> for T
source§impl<I, T, U> Upcast<I, U> for Twhere
U: UpcastFrom<I, T>,
impl<I, T, U> Upcast<I, U> for Twhere
U: UpcastFrom<I, T>,
source§impl<I, T> UpcastFrom<I, T> for T
impl<I, T> UpcastFrom<I, T> for T
fn upcast_from(from: T, _tcx: I) -> T
source§impl<Tcx, T> Value<Tcx> for Twhere
Tcx: DepContext,
impl<Tcx, T> Value<Tcx> for Twhere
Tcx: DepContext,
default fn from_cycle_error( tcx: Tcx, cycle_error: &CycleError, _guar: ErrorGuaranteed, ) -> T
source§impl<T> WithSubscriber for T
impl<T> WithSubscriber for T
source§fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
source§fn with_current_subscriber(self) -> WithDispatch<Self>
fn with_current_subscriber(self) -> WithDispatch<Self>
impl<'a, T> Captures<'a> for Twhere
T: ?Sized,
impl<'a, T> Captures<'a> for Twhere
T: ?Sized,
impl<T> ErasedDestructor for Twhere
T: 'static,
impl<T> MaybeSendSync for T
Layout§
Note: Most layout information is completely unstable and may even differ between compilations. The only exception is types with certain repr(...)
attributes. Please see the Rust Reference's “Type Layout” chapter for details on type layout guarantees.
Size: 128 bytes