Skip to main content

EqualityAnalysis

Struct EqualityAnalysis 

Source
pub struct EqualityAnalysis<'a, 'db> { /* private fields */ }
Expand description

Variable equality analysis.

This analyzer tracks snapshot/desnap, box/unbox, and array construct relationships as data flows through the program. At merge points (after match arms converge), we conservatively intersect the equivalence classes, keeping only equalities that hold on all paths.

Implementations§

Source§

impl<'a, 'db> EqualityAnalysis<'a, 'db>

Source

pub fn new(db: &'db dyn Database, lowered: &'a Lowered<'db>) -> Self

Creates a new equality analysis instance.

Source

pub fn analyze( db: &'db dyn Database, lowered: &'a Lowered<'db>, ) -> Vec<Option<EqualityState<'db>>>

Runs equality analysis on a lowered function. Returns the equality state at the exit of each block.

Trait Implementations§

Source§

impl<'db, 'a> DataflowAnalyzer<'db, 'a> for EqualityAnalysis<'a, 'db>

Source§

const DIRECTION: Direction = Direction::Forward

The direction of this analysis.
Source§

type Info = EqualityState<'db>

The analysis state/info type.
Source§

fn initial_info( &mut self, _block_id: BlockId, _block_end: &'a BlockEnd<'db>, ) -> Self::Info

Create the initial analysis state at a terminal block. Read more
Source§

fn merge( &mut self, _lowered: &Lowered<'db>, _statement_location: StatementLocation, info1: Self::Info, info2: Self::Info, ) -> Self::Info

Merge/join states from multiple control flow paths. Called at join points (match merge for backward, block entry for forward). Read more
Source§

fn transfer_stmt( &mut self, info: &mut Self::Info, _statement_location: StatementLocation, stmt: &'a Statement<'db>, )

Transfer function for a single statement. Read more
Source§

fn transfer_edge( &mut self, info: &Self::Info, edge: &Edge<'db, 'a>, ) -> Self::Info

Transfer state along a CFG edge. Called when traversing between blocks via control flow edges. Read more
Source§

fn transfer_block( &mut self, info: &mut Self::Info, block_id: BlockId, block: &'a Block<'db>, )

Transfer function for an entire block. Read more
Source§

fn visit_block_start( &mut self, _info: &mut Self::Info, _block_id: BlockId, _block: &Block<'db>, )

Called when entering a block during traversal (before transfer_block).
Source§

fn block_entry_location( &self, lowered: &Lowered<'db>, block_id: BlockId, ) -> LocationId<'db>

Block entry location. For Backward it is the merge location. For Forward it is the block entry location, if there is a statement. If not statement exists it will look at block end. This might recurse to next block if we have a goto with no remappings.

Auto Trait Implementations§

§

impl<'a, 'db> Freeze for EqualityAnalysis<'a, 'db>

§

impl<'a, 'db> !RefUnwindSafe for EqualityAnalysis<'a, 'db>

§

impl<'a, 'db> !Send for EqualityAnalysis<'a, 'db>

§

impl<'a, 'db> !Sync for EqualityAnalysis<'a, 'db>

§

impl<'a, 'db> Unpin for EqualityAnalysis<'a, 'db>

§

impl<'a, 'db> UnsafeUnpin for EqualityAnalysis<'a, 'db>

§

impl<'a, 'db> !UnwindSafe for EqualityAnalysis<'a, 'db>

Blanket Implementations§

Source§

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

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

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

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

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

Source§

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

Mutably borrows from an owned value. Read more
Source§

impl<'db, T> DebugDbUpcast<'db, T> for T
where T: ?Sized,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where 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> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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 more
Source§

impl<T> Lookup<T> for T

Source§

fn into_owned(self) -> T

Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T0, T1, E, TRewriter> SemanticRewriter<(T0, T1), E> for TRewriter
where TRewriter: SemanticRewriter<T0, E> + SemanticRewriter<T1, E>,

Source§

fn internal_rewrite(&mut self, value: &mut (T0, T1)) -> Result<RewriteResult, E>

Source§

fn rewrite(&mut self, value: T) -> Result<T, Error>

Source§

impl<T, E, TRewriter> SemanticRewriter<Box<T>, E> for TRewriter
where TRewriter: SemanticRewriter<T, E>,

Source§

fn internal_rewrite(&mut self, value: &mut Box<T>) -> Result<RewriteResult, E>

Source§

fn rewrite(&mut self, value: T) -> Result<T, Error>

Source§

impl<T, E, TRewriter> SemanticRewriter<Deque<T>, E> for TRewriter
where TRewriter: SemanticRewriter<T, E>,

Source§

fn internal_rewrite(&mut self, value: &mut Deque<T>) -> Result<RewriteResult, E>

Source§

fn rewrite(&mut self, value: T) -> Result<T, Error>

Source§

impl<T, E, TRewriter> SemanticRewriter<Option<T>, E> for TRewriter
where TRewriter: SemanticRewriter<T, E>,

Source§

fn internal_rewrite( &mut self, value: &mut Option<T>, ) -> Result<RewriteResult, E>

Source§

fn rewrite(&mut self, value: T) -> Result<T, Error>

Source§

impl<'a, K, V, E, TRewriter> SemanticRewriter<OrderedHashMap<K, V>, E> for TRewriter
where K: Hash + Eq + LanguageElementId<'a>, V: Clone, TRewriter: SemanticRewriter<V, E>,

Source§

fn internal_rewrite( &mut self, value: &mut OrderedHashMap<K, V>, ) -> Result<RewriteResult, E>

Source§

fn rewrite(&mut self, value: T) -> Result<T, Error>

Source§

impl<T, E, TRewriter, E2> SemanticRewriter<Result<T, E2>, E> for TRewriter
where TRewriter: SemanticRewriter<T, E>,

Source§

fn internal_rewrite( &mut self, value: &mut Result<T, E2>, ) -> Result<RewriteResult, E>

Source§

fn rewrite(&mut self, value: T) -> Result<T, Error>

Source§

impl<T, E, TRewriter> SemanticRewriter<Vec<T>, E> for TRewriter
where TRewriter: SemanticRewriter<T, E>,

Source§

fn internal_rewrite(&mut self, value: &mut Vec<T>) -> Result<RewriteResult, E>

Source§

fn rewrite(&mut self, value: T) -> Result<T, Error>

Source§

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

Source§

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 T
where U: TryFrom<T>,

Source§

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.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more