struct SimplifyMatch<'tcx, 'a> {
tcx: TyCtxt<'tcx>,
typing_env: TypingEnv<'tcx>,
patch: MirPatch<'tcx>,
body: &'a Body<'tcx>,
switch_bb: BasicBlock,
discr: &'a Operand<'tcx>,
discr_local: Option<Local>,
discr_ty: Ty<'tcx>,
}Fields§
§tcx: TyCtxt<'tcx>§typing_env: TypingEnv<'tcx>§patch: MirPatch<'tcx>§body: &'a Body<'tcx>§switch_bb: BasicBlock§discr: &'a Operand<'tcx>§discr_local: Option<Local>§discr_ty: Ty<'tcx>Implementations§
Source§impl<'tcx, 'a> SimplifyMatch<'tcx, 'a>
impl<'tcx, 'a> SimplifyMatch<'tcx, 'a>
fn discr_local(&mut self) -> Local
Sourcefn unify_if_equal_const(
&self,
dest: Place<'tcx>,
consts: &[(u128, &ConstOperand<'tcx>)],
otherwise: Option<&ConstOperand<'tcx>>,
) -> Option<StatementKind<'tcx>>
fn unify_if_equal_const( &self, dest: Place<'tcx>, consts: &[(u128, &ConstOperand<'tcx>)], otherwise: Option<&ConstOperand<'tcx>>, ) -> Option<StatementKind<'tcx>>
Unifies the assignments if all rvalues are constants and equal.
Sourcefn unify_by_eq_op(
&mut self,
dest: Place<'tcx>,
consts: &[(u128, &ConstOperand<'tcx>)],
otherwise: Option<&ConstOperand<'tcx>>,
) -> Option<StatementKind<'tcx>>
fn unify_by_eq_op( &mut self, dest: Place<'tcx>, consts: &[(u128, &ConstOperand<'tcx>)], otherwise: Option<&ConstOperand<'tcx>>, ) -> Option<StatementKind<'tcx>>
If a source block is found that switches between two blocks that are exactly the same modulo const bool assignments (e.g., one assigns true another false to the same place), unify a target block statements into the source block, using Eq / Ne comparison with switch value where const bools value differ.
For example:
bb0: {
switchInt(move _3) -> [42_isize: bb1, otherwise: bb2];
}
bb1: {
_2 = const true;
goto -> bb3;
}
bb2: {
_2 = const false;
goto -> bb3;
}into:
bb0: {
_2 = Eq(move _3, const 42_isize);
goto -> bb3;
}Sourcefn unify_by_int_to_int(
&mut self,
dest: Place<'tcx>,
consts: &[(u128, &ConstOperand<'tcx>)],
) -> Option<StatementKind<'tcx>>
fn unify_by_int_to_int( &mut self, dest: Place<'tcx>, consts: &[(u128, &ConstOperand<'tcx>)], ) -> Option<StatementKind<'tcx>>
Unifies the assignments if all rvalues can be cast from the discriminant value by IntToInt.
For example:
bb0: {
switchInt(_1) -> [1: bb2, 2: bb3, 3: bb4, otherwise: bb1];
}
bb1: {
unreachable;
}
bb2: {
_0 = const 1_i16;
goto -> bb5;
}
bb3: {
_0 = const 2_i16;
goto -> bb5;
}
bb4: {
_0 = const 3_i16;
goto -> bb5;
}into:
bb0: {
_0 = _1 as i16 (IntToInt);
goto -> bb5;
}Sourcefn unify_by_copy(
&self,
dest: Place<'tcx>,
rvals: &[(u128, &Rvalue<'tcx>)],
) -> Option<StatementKind<'tcx>>
fn unify_by_copy( &self, dest: Place<'tcx>, rvals: &[(u128, &Rvalue<'tcx>)], ) -> Option<StatementKind<'tcx>>
Sourcefn try_unify_stmts(
&mut self,
index: usize,
stmts: &[(u128, &StatementKind<'tcx>)],
otherwise: Option<&StatementKind<'tcx>>,
) -> Option<StatementKind<'tcx>>
fn try_unify_stmts( &mut self, index: usize, stmts: &[(u128, &StatementKind<'tcx>)], otherwise: Option<&StatementKind<'tcx>>, ) -> Option<StatementKind<'tcx>>
Returns a new statement if we can use the statement replace all statements.
Auto Trait Implementations§
impl<'tcx, 'a> DynSend for SimplifyMatch<'tcx, 'a>
impl<'tcx, 'a> DynSync for SimplifyMatch<'tcx, 'a>
impl<'tcx, 'a> Freeze for SimplifyMatch<'tcx, 'a>
impl<'tcx, 'a> !RefUnwindSafe for SimplifyMatch<'tcx, 'a>
impl<'tcx, 'a> !Send for SimplifyMatch<'tcx, 'a>
impl<'tcx, 'a> !Sync for SimplifyMatch<'tcx, 'a>
impl<'tcx, 'a> Unpin for SimplifyMatch<'tcx, 'a>
impl<'tcx, 'a> !UnsafeUnpin for SimplifyMatch<'tcx, 'a>
impl<'tcx, 'a> !UnwindSafe for SimplifyMatch<'tcx, 'a>
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> 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
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<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<T> ErasedDestructor for Twhere
T: 'static,
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: 240 bytes