pub struct SsaLocals {
    assignments: IndexVec<Local, Set1<LocationExtended>>,
    assignment_order: Vec<Local>,
    copy_classes: IndexVec<Local, Local>,
    direct_uses: IndexVec<Local, u32>,
}

Fields§

§assignments: IndexVec<Local, Set1<LocationExtended>>

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).

Implementations§

source§

impl SsaLocals

source

pub fn new<'tcx>(body: &Body<'tcx>) -> SsaLocals

source

pub fn num_locals(&self) -> usize

source

pub fn locals(&self) -> impl Iterator<Item = Local>

source

pub fn is_ssa(&self, local: Local) -> bool

source

pub fn num_direct_uses(&self, local: Local) -> u32

Return the number of uses if a local that are not “Deref”.

source

pub fn assignment_dominates( &self, dominators: &Dominators<BasicBlock>, local: Local, location: Location ) -> bool

source

pub fn assignments<'a, 'tcx>( &'a self, body: &'a Body<'tcx> ) -> impl Iterator<Item = (Local, &'a Rvalue<'tcx>, Location)> + 'a

source

pub fn for_each_assignment_mut<'tcx>( &self, basic_blocks: &mut BasicBlocks<'tcx>, f: impl FnMut(Local, &mut Rvalue<'tcx>, Location) )

source

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 substituted.

source

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§

Blanket Implementations§

source§

impl<T> Any for Twhere T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for Twhere U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T, U> TryFrom<U> for Twhere U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.

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: 96 bytes