struct InstSimplifyContext<'a, 'tcx> {
tcx: TyCtxt<'tcx>,
local_decls: &'a LocalDecls<'tcx>,
typing_env: TypingEnv<'tcx>,
}Fields§
§tcx: TyCtxt<'tcx>§local_decls: &'a LocalDecls<'tcx>§typing_env: TypingEnv<'tcx>Implementations§
Source§impl<'tcx> InstSimplifyContext<'_, 'tcx>
impl<'tcx> InstSimplifyContext<'_, 'tcx>
Sourcefn simplify_repeated_aggregate(&self, rvalue: &mut Rvalue<'tcx>)
fn simplify_repeated_aggregate(&self, rvalue: &mut Rvalue<'tcx>)
Transform aggregates like [0, 0, 0, 0, 0] into [0; 5]. GVN can also do this optimization, but GVN is only run at mir-opt-level 2 so having this in InstSimplify helps unoptimized builds.
Sourcefn simplify_bool_cmp(&self, rvalue: &mut Rvalue<'tcx>)
fn simplify_bool_cmp(&self, rvalue: &mut Rvalue<'tcx>)
Transform boolean comparisons into logical operations.
fn try_eval_bool(&self, a: &Operand<'_>) -> Option<bool>
Sourcefn simplify_ref_deref(&self, rvalue: &mut Rvalue<'tcx>)
fn simplify_ref_deref(&self, rvalue: &mut Rvalue<'tcx>)
Transform &(*a) ==> a.
Sourcefn simplify_ptr_aggregate(&self, rvalue: &mut Rvalue<'tcx>)
fn simplify_ptr_aggregate(&self, rvalue: &mut Rvalue<'tcx>)
Transform Aggregate(RawPtr, [p, ()]) ==> Cast(PtrToPtr, p).
fn simplify_cast(&self, rvalue: &mut Rvalue<'tcx>)
Sourcefn simplify_repeat_once(&self, rvalue: &mut Rvalue<'tcx>)
fn simplify_repeat_once(&self, rvalue: &mut Rvalue<'tcx>)
Simplify [x; 1] to just [x].
fn simplify_primitive_clone( &self, terminator: &mut Terminator<'tcx>, statements: &mut Vec<Statement<'tcx>>, )
Sourcefn simplify_size_or_align_of_val(
&self,
terminator: &mut Terminator<'tcx>,
statements: &mut Vec<Statement<'tcx>>,
)
fn simplify_size_or_align_of_val( &self, terminator: &mut Terminator<'tcx>, statements: &mut Vec<Statement<'tcx>>, )
Simplify size_of_val and align_of_val if we don’t actually need
to look at the value in order to calculate the result:
- For
Sizedtypes we can always do this for both, - For
align_of_val::<[T]>we can returnalign_of::<T>(), since it doesn’t depend on the slice’s length and the elements are sized.
This is here so it can run after inlining, where it’s more useful. (LowerIntrinsics is done in cleanup, before the optimization passes.)
Note that we intentionally just produce the lang item constants so this works on generic types and avoids any risk of layout calculation cycles.
fn simplify_nounwind_call(&self, terminator: &mut Terminator<'tcx>)
fn simplify_intrinsic_assert(&self, terminator: &mut Terminator<'tcx>)
Auto Trait Implementations§
impl<'a, 'tcx> DynSend for InstSimplifyContext<'a, 'tcx>
impl<'a, 'tcx> DynSync for InstSimplifyContext<'a, 'tcx>
impl<'a, 'tcx> Freeze for InstSimplifyContext<'a, 'tcx>
impl<'a, 'tcx> !RefUnwindSafe for InstSimplifyContext<'a, 'tcx>
impl<'a, 'tcx> !Send for InstSimplifyContext<'a, 'tcx>
impl<'a, 'tcx> !Sync for InstSimplifyContext<'a, 'tcx>
impl<'a, 'tcx> Unpin for InstSimplifyContext<'a, 'tcx>
impl<'a, 'tcx> !UnsafeUnpin for InstSimplifyContext<'a, 'tcx>
impl<'a, 'tcx> !UnwindSafe for InstSimplifyContext<'a, 'tcx>
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: 48 bytes