pub(crate) 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(crate) fn new<'tcx>( tcx: TyCtxt<'tcx>, body: &Body<'tcx>, param_env: ParamEnv<'tcx>, ) -> SsaLocals
pub(crate) fn num_locals(&self) -> usize
pub(crate) fn locals(&self) -> impl Iterator<Item = Local>
pub(crate) fn is_ssa(&self, local: Local) -> bool
Sourcepub(crate) fn num_direct_uses(&self, local: Local) -> u32
pub(crate) fn num_direct_uses(&self, local: Local) -> u32
Return the number of uses if a local that are not “Deref”.
pub(crate) fn assignment_dominates( &self, dominators: &Dominators<BasicBlock>, local: Local, location: Location, ) -> bool
pub(crate) fn assignments<'a, 'tcx>( &'a self, body: &'a Body<'tcx>, ) -> impl Iterator<Item = (Local, &'a Rvalue<'tcx>, Location)> + 'a
pub(crate) fn for_each_assignment_mut<'tcx>( &self, basic_blocks: &mut IndexSlice<BasicBlock, BasicBlockData<'tcx>>, f: impl FnMut(Local, AssignedValue<'_, 'tcx>, Location), )
Sourcepub(crate) fn copy_classes(&self) -> &IndexSlice<Local, Local>
pub(crate) 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(crate) fn borrowed_locals(&self) -> &BitSet<Local>
pub(crate) fn borrowed_locals(&self) -> &BitSet<Local>
Set of SSA locals that are immutably borrowed.
Sourcepub(crate) fn meet_copy_equivalence(&self, property: &mut BitSet<Local>)
pub(crate) 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 DynSend for SsaLocals
impl DynSync for SsaLocals
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
§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<T> Pointable for T
impl<T> Pointable for T
§impl<I, T> UpcastFrom<I, T> for T
impl<I, T> UpcastFrom<I, T> for T
fn upcast_from(from: T, _tcx: I) -> T
§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