struct TOFinder<'a, 'tcx> {
tcx: TyCtxt<'tcx>,
param_env: ParamEnv<'tcx>,
ecx: InterpCx<'tcx, DummyMachine>,
body: &'a Body<'tcx>,
map: Map<'tcx>,
loop_headers: BitSet<BasicBlock>,
arena: &'a DroplessArena,
opportunities: Vec<ThreadingOpportunity>,
}
Fields§
§tcx: TyCtxt<'tcx>
§param_env: ParamEnv<'tcx>
§ecx: InterpCx<'tcx, DummyMachine>
§body: &'a Body<'tcx>
§map: Map<'tcx>
§loop_headers: BitSet<BasicBlock>
§arena: &'a DroplessArena
We use an arena to avoid cloning the slices when cloning state
.
opportunities: Vec<ThreadingOpportunity>
Implementations§
source§impl<'a, 'tcx> TOFinder<'a, 'tcx>
impl<'a, 'tcx> TOFinder<'a, 'tcx>
fn is_empty(&self, state: &State<ConditionSet<'a>>) -> bool
sourcefn start_from_switch(&mut self, bb: BasicBlock)
fn start_from_switch(&mut self, bb: BasicBlock)
Recursion entry point to find threading opportunities.
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, )
Recursively walk statements backwards from this bb’s terminator 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>>, )
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>>, )
fn process_assign( &mut self, bb: BasicBlock, lhs_place: &Place<'tcx>, rhs: &Rvalue<'tcx>, state: &mut State<ConditionSet<'a>>, )
fn process_statement( &mut self, bb: BasicBlock, stmt: &Statement<'tcx>, state: &mut State<ConditionSet<'a>>, )
fn recurse_through_terminator( &mut self, bb: BasicBlock, state: impl FnOnce() -> 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>>, )
Auto Trait Implementations§
impl<'a, 'tcx> !DynSend for TOFinder<'a, 'tcx>
impl<'a, 'tcx> !DynSync for TOFinder<'a, 'tcx>
impl<'a, 'tcx> Freeze for TOFinder<'a, 'tcx>
impl<'a, 'tcx> !RefUnwindSafe for TOFinder<'a, 'tcx>
impl<'a, 'tcx> !Send for TOFinder<'a, 'tcx>
impl<'a, 'tcx> !Sync for TOFinder<'a, 'tcx>
impl<'a, 'tcx> Unpin for TOFinder<'a, 'tcx>
impl<'a, 'tcx> !UnwindSafe for TOFinder<'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> 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>
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<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: 432 bytes