struct ConstPropagator<'mir, 'tcx> {
ecx: InterpCx<'tcx, DummyMachine>,
tcx: TyCtxt<'tcx>,
param_env: ParamEnv<'tcx>,
worklist: Vec<BasicBlock>,
visited_blocks: BitSet<BasicBlock>,
locals: IndexVec<Local, Value<'tcx>>,
body: &'mir Body<'tcx>,
written_only_inside_own_block_locals: FxHashSet<Local>,
can_const_prop: IndexVec<Local, ConstPropMode>,
}
Expand description
Visits MIR nodes, performs const propagation and runs lint checks as it goes
Fields§
§ecx: InterpCx<'tcx, DummyMachine>
§tcx: TyCtxt<'tcx>
§param_env: ParamEnv<'tcx>
§worklist: Vec<BasicBlock>
§visited_blocks: BitSet<BasicBlock>
§locals: IndexVec<Local, Value<'tcx>>
§body: &'mir Body<'tcx>
§written_only_inside_own_block_locals: FxHashSet<Local>
§can_const_prop: IndexVec<Local, ConstPropMode>
Implementations§
source§impl<'mir, 'tcx> ConstPropagator<'mir, 'tcx>
impl<'mir, 'tcx> ConstPropagator<'mir, 'tcx>
fn new(body: &'mir Body<'tcx>, tcx: TyCtxt<'tcx>) -> ConstPropagator<'mir, 'tcx>
fn local_decls(&self) -> &'mir LocalDecls<'tcx>
fn get_const(&self, place: Place<'tcx>) -> Option<&Value<'tcx>>
sourcefn remove_const(&mut self, local: Local)
fn remove_const(&mut self, local: Local)
Remove local
from the pool of Locals
. Allows writing to them,
but not reading from them anymore.
fn access_mut(&mut self, place: &Place<'_>) -> Option<&mut Value<'tcx>>
fn lint_root(&self, source_info: SourceInfo) -> Option<HirId>
fn use_ecx<F, T>(&mut self, f: F) -> Option<T>
sourcefn eval_constant(&mut self, c: &ConstOperand<'tcx>) -> Option<ImmTy<'tcx>>
fn eval_constant(&mut self, c: &ConstOperand<'tcx>) -> Option<ImmTy<'tcx>>
Returns the value, if any, of evaluating c
.
sourcefn eval_place(&mut self, place: Place<'tcx>) -> Option<ImmTy<'tcx>>
fn eval_place(&mut self, place: Place<'tcx>) -> Option<ImmTy<'tcx>>
Returns the value, if any, of evaluating place
.
sourcefn eval_operand(&mut self, op: &Operand<'tcx>) -> Option<ImmTy<'tcx>>
fn eval_operand(&mut self, op: &Operand<'tcx>) -> Option<ImmTy<'tcx>>
Returns the value, if any, of evaluating op
. Calls upon eval_constant
or eval_place
, depending on the variant of Operand
used.
fn report_assert_as_lint( &self, location: Location, lint_kind: AssertLintKind, assert_kind: AssertKind<impl Debug>, )
fn check_unary_op( &mut self, op: UnOp, arg: &Operand<'tcx>, location: Location, ) -> Option<()>
fn check_binary_op( &mut self, op: BinOp, left: &Operand<'tcx>, right: &Operand<'tcx>, location: Location, ) -> Option<()>
fn check_rvalue( &mut self, rvalue: &Rvalue<'tcx>, location: Location, ) -> Option<()>
fn check_assertion( &mut self, expected: bool, msg: &AssertKind<Operand<'tcx>>, cond: &Operand<'tcx>, location: Location, ) -> Option<!>
fn ensure_not_propagated(&self, local: Local)
fn eval_rvalue( &mut self, rvalue: &Rvalue<'tcx>, dest: &Place<'tcx>, ) -> Option<()>
Trait Implementations§
source§impl HasDataLayout for ConstPropagator<'_, '_>
impl HasDataLayout for ConstPropagator<'_, '_>
fn data_layout(&self) -> &TargetDataLayout
source§impl<'tcx> HasParamEnv<'tcx> for ConstPropagator<'_, 'tcx>
impl<'tcx> HasParamEnv<'tcx> for ConstPropagator<'_, 'tcx>
source§impl<'tcx> LayoutOfHelpers<'tcx> for ConstPropagator<'_, 'tcx>
impl<'tcx> LayoutOfHelpers<'tcx> for ConstPropagator<'_, 'tcx>
§type LayoutOfResult = Result<TyAndLayout<'tcx, Ty<'tcx>>, LayoutError<'tcx>>
type LayoutOfResult = Result<TyAndLayout<'tcx, Ty<'tcx>>, LayoutError<'tcx>>
The
TyAndLayout
-wrapping type (or TyAndLayout
itself), which will be
returned from layout_of
(see also handle_layout_err
).source§fn handle_layout_err(
&self,
err: LayoutError<'tcx>,
_: Span,
_: Ty<'tcx>,
) -> LayoutError<'tcx>
fn handle_layout_err( &self, err: LayoutError<'tcx>, _: Span, _: Ty<'tcx>, ) -> LayoutError<'tcx>
Helper used for
layout_of
, to adapt tcx.layout_of(...)
into a
Self::LayoutOfResult
(which does not need to be a Result<...>
). Read moresource§fn layout_tcx_at_span(&self) -> Span
fn layout_tcx_at_span(&self) -> Span
Span
to use for tcx.at(span)
, from layout_of
.source§impl<'tcx> Visitor<'tcx> for ConstPropagator<'_, 'tcx>
impl<'tcx> Visitor<'tcx> for ConstPropagator<'_, 'tcx>
fn visit_body(&mut self, body: &Body<'tcx>)
fn visit_operand(&mut self, operand: &Operand<'tcx>, location: Location)
source§fn visit_const_operand(
&mut self,
constant: &ConstOperand<'tcx>,
location: Location,
)
fn visit_const_operand( &mut self, constant: &ConstOperand<'tcx>, location: Location, )
This is called for every constant in the MIR body and every
required_consts
(i.e., including consts that have been dead-code-eliminated).fn visit_assign( &mut self, place: &Place<'tcx>, rvalue: &Rvalue<'tcx>, location: Location, )
fn visit_statement(&mut self, statement: &Statement<'tcx>, location: Location)
fn visit_terminator( &mut self, terminator: &Terminator<'tcx>, location: Location, )
fn visit_basic_block_data( &mut self, block: BasicBlock, data: &BasicBlockData<'tcx>, )
fn visit_source_scope_data(&mut self, scope_data: &SourceScopeData<'tcx>)
fn visit_assert_message( &mut self, msg: &AssertKind<Operand<'tcx>>, location: Location, )
fn visit_rvalue(&mut self, rvalue: &Rvalue<'tcx>, location: Location)
fn visit_ascribe_user_ty( &mut self, place: &Place<'tcx>, variance: Variance, user_ty: &UserTypeProjection, location: Location, )
fn visit_coverage(&mut self, kind: &CoverageKind, location: Location)
fn visit_retag( &mut self, kind: RetagKind, place: &Place<'tcx>, location: Location, )
fn visit_place( &mut self, place: &Place<'tcx>, context: PlaceContext, location: Location, )
fn visit_projection( &mut self, place_ref: PlaceRef<'tcx>, context: PlaceContext, location: Location, )
fn visit_projection_elem( &mut self, place_ref: PlaceRef<'tcx>, elem: ProjectionElem<Local, Ty<'tcx>>, context: PlaceContext, location: Location, )
fn super_place( &mut self, place: &Place<'tcx>, context: PlaceContext, location: Location, )
fn super_projection( &mut self, place_ref: PlaceRef<'tcx>, context: PlaceContext, location: Location, )
fn super_projection_elem( &mut self, _place_ref: PlaceRef<'tcx>, elem: ProjectionElem<Local, Ty<'tcx>>, _context: PlaceContext, location: Location, )
fn visit_ty_const(&mut self, ct: Const<'tcx>, location: Location)
fn visit_span(&mut self, span: Span)
fn visit_source_info(&mut self, source_info: &SourceInfo)
fn visit_ty(&mut self, ty: Ty<'tcx>, _: TyContext)
fn visit_user_type_projection(&mut self, ty: &UserTypeProjection)
fn visit_user_type_annotation( &mut self, index: UserTypeAnnotationIndex, ty: &CanonicalUserTypeAnnotation<'tcx>, )
fn visit_region(&mut self, region: Region<'tcx>, _: Location)
fn visit_args( &mut self, args: &&'tcx RawList<(), GenericArg<'tcx>>, _: Location, )
fn visit_local_decl(&mut self, local: Local, local_decl: &LocalDecl<'tcx>)
fn visit_var_debug_info(&mut self, var_debug_info: &VarDebugInfo<'tcx>)
fn visit_local( &mut self, _local: Local, _context: PlaceContext, _location: Location, )
fn visit_source_scope(&mut self, scope: SourceScope)
fn super_body(&mut self, body: &Body<'tcx>)
fn super_basic_block_data( &mut self, block: BasicBlock, data: &BasicBlockData<'tcx>, )
fn super_source_scope_data(&mut self, scope_data: &SourceScopeData<'tcx>)
fn super_statement(&mut self, statement: &Statement<'tcx>, location: Location)
fn super_assign( &mut self, place: &Place<'tcx>, rvalue: &Rvalue<'tcx>, location: Location, )
fn super_terminator( &mut self, terminator: &Terminator<'tcx>, location: Location, )
fn super_assert_message( &mut self, msg: &AssertKind<Operand<'tcx>>, location: Location, )
fn super_rvalue(&mut self, rvalue: &Rvalue<'tcx>, location: Location)
fn super_operand(&mut self, operand: &Operand<'tcx>, location: Location)
fn super_ascribe_user_ty( &mut self, place: &Place<'tcx>, variance: Variance, user_ty: &UserTypeProjection, location: Location, )
fn super_coverage(&mut self, _kind: &CoverageKind, _location: Location)
fn super_retag( &mut self, _kind: RetagKind, place: &Place<'tcx>, location: Location, )
fn super_local_decl(&mut self, local: Local, local_decl: &LocalDecl<'tcx>)
fn super_var_debug_info(&mut self, var_debug_info: &VarDebugInfo<'tcx>)
fn super_source_scope(&mut self, _scope: SourceScope)
fn super_const_operand( &mut self, constant: &ConstOperand<'tcx>, location: Location, )
fn super_ty_const(&mut self, _ct: Const<'tcx>, _location: Location)
fn super_span(&mut self, _span: Span)
fn super_source_info(&mut self, source_info: &SourceInfo)
fn super_user_type_projection(&mut self, _ty: &UserTypeProjection)
fn super_user_type_annotation( &mut self, _index: UserTypeAnnotationIndex, ty: &CanonicalUserTypeAnnotation<'tcx>, )
fn super_ty(&mut self, _ty: Ty<'tcx>)
fn super_region(&mut self, _region: Region<'tcx>)
fn super_args(&mut self, _args: &&'tcx RawList<(), GenericArg<'tcx>>)
fn visit_location(&mut self, body: &Body<'tcx>, location: Location)
Auto Trait Implementations§
impl<'mir, 'tcx> DynSend for ConstPropagator<'mir, 'tcx>
impl<'mir, 'tcx> !DynSync for ConstPropagator<'mir, 'tcx>
impl<'mir, 'tcx> !Freeze for ConstPropagator<'mir, 'tcx>
impl<'mir, 'tcx> !RefUnwindSafe for ConstPropagator<'mir, 'tcx>
impl<'mir, 'tcx> !Send for ConstPropagator<'mir, 'tcx>
impl<'mir, 'tcx> !Sync for ConstPropagator<'mir, 'tcx>
impl<'mir, 'tcx> Unpin for ConstPropagator<'mir, 'tcx>
impl<'mir, 'tcx> !UnwindSafe for ConstPropagator<'mir, '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
Mutably borrows from an owned value. Read more
source§impl<T, R> CollectAndApply<T, R> for T
impl<T, R> CollectAndApply<T, R> for T
source§impl<T> Filterable for T
impl<T> Filterable for T
source§fn filterable(
self,
filter_name: &'static str,
) -> RequestFilterDataProvider<T, fn(_: DataRequest<'_>) -> bool>
fn filterable( self, filter_name: &'static str, ) -> RequestFilterDataProvider<T, fn(_: DataRequest<'_>) -> bool>
Creates a filterable data provider with the given name for debugging. Read more
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>
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 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>
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 moresource§impl<P> IntoQueryParam<P> for P
impl<P> IntoQueryParam<P> for P
fn into_query_param(self) -> P
source§impl<'tcx, C> LayoutOf<'tcx> for Cwhere
C: LayoutOfHelpers<'tcx>,
impl<'tcx, C> LayoutOf<'tcx> for Cwhere
C: LayoutOfHelpers<'tcx>,
source§fn layout_of(&self, ty: Ty<'tcx>) -> Self::LayoutOfResult
fn layout_of(&self, ty: Ty<'tcx>) -> Self::LayoutOfResult
Computes the layout of a type. Note that this implicitly
executes in “reveal all” mode, and will normalize the input type.
source§fn spanned_layout_of(&self, ty: Ty<'tcx>, span: Span) -> Self::LayoutOfResult
fn spanned_layout_of(&self, ty: Ty<'tcx>, span: Span) -> Self::LayoutOfResult
Computes the layout of a type, at
span
. Note that this implicitly
executes in “reveal all” mode, and will normalize the input type.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<T> PointerArithmetic for Twhere
T: HasDataLayout,
impl<T> PointerArithmetic for Twhere
T: HasDataLayout,
fn pointer_size(&self) -> Size
fn max_size_of_val(&self) -> Size
fn target_usize_max(&self) -> u64
fn target_isize_min(&self) -> i64
fn target_isize_max(&self) -> i64
fn target_usize_to_isize(&self, val: u64) -> i64
source§fn truncate_to_ptr(&self, _: (u64, bool)) -> (u64, bool)
fn truncate_to_ptr(&self, _: (u64, bool)) -> (u64, bool)
Helper function: truncate given value-“overflowed flag” pair to pointer size and
update “overflowed flag” if there was an overflow.
This should be called by all the other methods before returning!
fn overflowing_offset(&self, val: u64, i: u64) -> (u64, bool)
fn overflowing_signed_offset(&self, val: u64, i: i64) -> (u64, bool)
fn offset<'tcx>(&self, val: u64, i: u64) -> Result<u64, InterpErrorInfo<'tcx>>
fn signed_offset<'tcx>( &self, val: u64, i: i64, ) -> Result<u64, InterpErrorInfo<'tcx>>
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<Tcx, T> Value<Tcx> for Twhere
Tcx: DepContext,
impl<Tcx, T> Value<Tcx> for Twhere
Tcx: DepContext,
default fn from_cycle_error( tcx: Tcx, cycle_error: &CycleError, _guar: ErrorGuaranteed, ) -> 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<'a, T> Captures<'a> for Twhere
T: ?Sized,
impl<'a, T> Captures<'a> for Twhere
T: ?Sized,
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: 368 bytes