Struct rustc_mir_transform::jump_threading::TOFinder
source · struct TOFinder<'tcx, 'a> {
tcx: TyCtxt<'tcx>,
param_env: ParamEnv<'tcx>,
ecx: InterpCx<'tcx, 'tcx, DummyMachine>,
body: &'a Body<'tcx>,
map: &'a Map,
loop_headers: &'a BitSet<BasicBlock>,
arena: &'a DroplessArena,
opportunities: Vec<ThreadingOpportunity>,
}
Fields§
§tcx: TyCtxt<'tcx>
§param_env: ParamEnv<'tcx>
§ecx: InterpCx<'tcx, 'tcx, DummyMachine>
§body: &'a Body<'tcx>
§map: &'a Map
§loop_headers: &'a BitSet<BasicBlock>
§arena: &'a DroplessArena
We use an arena to avoid cloning the slices when cloning state
.
opportunities: Vec<ThreadingOpportunity>
Implementations§
source§impl<'tcx, 'a> TOFinder<'tcx, 'a>
impl<'tcx, 'a> TOFinder<'tcx, 'a>
fn is_empty(&self, state: &State<ConditionSet<'a>>) -> bool
sourcefn find_opportunity(
&mut self,
bb: BasicBlock,
state: State<ConditionSet<'a>>,
cost: CostChecker<'_, 'tcx>,
depth: usize
)
fn find_opportunity( &mut self, bb: BasicBlock, state: State<ConditionSet<'a>>, cost: CostChecker<'_, 'tcx>, depth: usize )
Recursion entry point to find threading opportunities.
sourcefn mutated_statement(
&self,
stmt: &Statement<'tcx>
) -> Option<(Place<'tcx>, Option<TrackElem>)>
fn mutated_statement( &self, stmt: &Statement<'tcx> ) -> Option<(Place<'tcx>, Option<TrackElem>)>
Extract the mutated place from a statement.
This method returns the Place
so we can flood the state in case of a partial assignment.
(_1 as Ok).0 = _5;
(_1 as Err).0 = _6;
We want to ensure that a SwitchInt((_1 as Ok).0)
does not see the first assignment, as
the value may have been mangled by the second assignment.
In case we assign to a discriminant, we return Some(TrackElem::Discriminant)
, so we can
stop at flooding the discriminant, and preserve the variant fields.
(_1 as Some).0 = _6;
SetDiscriminant(_1, 1);
switchInt((_1 as Some).0)
fn process_immediate( &mut self, bb: BasicBlock, lhs: PlaceIndex, rhs: ImmTy<'tcx>, state: &mut State<ConditionSet<'a>> ) -> Option<!>
sourcefn process_constant(
&mut self,
bb: BasicBlock,
lhs: PlaceIndex,
constant: OpTy<'tcx>,
state: &mut State<ConditionSet<'a>>
)
fn process_constant( &mut self, bb: BasicBlock, lhs: PlaceIndex, constant: OpTy<'tcx>, state: &mut State<ConditionSet<'a>> )
If we expect lhs ?= A
, we have an opportunity if we assume constant == A
.
fn process_operand( &mut self, bb: BasicBlock, lhs: PlaceIndex, rhs: &Operand<'tcx>, state: &mut State<ConditionSet<'a>> ) -> Option<!>
fn process_assign( &mut self, bb: BasicBlock, lhs_place: &Place<'tcx>, rhs: &Rvalue<'tcx>, state: &mut State<ConditionSet<'a>> ) -> Option<!>
fn process_statement( &mut self, bb: BasicBlock, stmt: &Statement<'tcx>, state: &mut State<ConditionSet<'a>> ) -> Option<!>
fn recurse_through_terminator( &mut self, bb: BasicBlock, state: &State<ConditionSet<'a>>, cost: &CostChecker<'_, 'tcx>, depth: usize )
fn process_switch_int( &mut self, discr: &Operand<'tcx>, targets: &SwitchTargets, target_bb: BasicBlock, state: &mut State<ConditionSet<'a>> ) -> Option<!>
Auto Trait Implementations§
impl<'tcx, 'a> !DynSend for TOFinder<'tcx, 'a>
impl<'tcx, 'a> !DynSync for TOFinder<'tcx, 'a>
impl<'tcx, 'a> !Freeze for TOFinder<'tcx, 'a>
impl<'tcx, 'a> !RefUnwindSafe for TOFinder<'tcx, 'a>
impl<'tcx, 'a> !Send for TOFinder<'tcx, 'a>
impl<'tcx, 'a> !Sync for TOFinder<'tcx, 'a>
impl<'tcx, 'a> Unpin for TOFinder<'tcx, 'a>
impl<'tcx, 'a> !UnwindSafe for TOFinder<'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
§impl<T> Filterable for T
impl<T> Filterable 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<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
§impl<T> Pointable for T
impl<T> Pointable for T
source§impl<'tcx, T> ToPredicate<'tcx, T> for T
impl<'tcx, T> ToPredicate<'tcx, T> for T
fn to_predicate(self, _tcx: TyCtxt<'tcx>) -> 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: 280 bytes