Struct rustc_mir_transform::ssa::SsaLocals
source · 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
impl SsaLocals
pub fn new<'tcx>(body: &Body<'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 BasicBlocks<'tcx>, f: impl FnMut(Local, &mut Rvalue<'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 substituted.
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 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
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