struct LoopNumericSummary {
initial_constants: FxHashMap<Local, i128>,
steps: FxHashMap<Local, i128>,
guard_upper_bounds: FxHashMap<Local, NumericTerm>,
entry_lower_bounds: FxHashMap<Local, i128>,
}Expand description
Numeric induction summary for one loop SCC.
This pass currently recognizes the small affine fragment needed by the threshold tests and by common counter loops:
x = constbefore the loop.x = x + c,x = x - c, or the checked-overflow formtmp = x + c; x = tmp.0inside the loop.
Fields§
§initial_constants: FxHashMap<Local, i128>Constants assigned before entering this SCC.
steps: FxHashMap<Local, i128>Per-iteration affine step for locals recognized as induction variables.
guard_upper_bounds: FxHashMap<Local, NumericTerm>Loop guard upper bounds, for example i < len.
entry_lower_bounds: FxHashMap<Local, i128>Lower bounds known on paths that enter this SCC, for example
if len < 10 { return } gives len >= 10.
Implementations§
Source§impl LoopNumericSummary
impl LoopNumericSummary
Sourcefn new<'tcx>(
tcx: TyCtxt<'tcx>,
def_id: DefId,
body: &Body<'tcx>,
graph: &PathGraph<'_>,
component: &LoopComponent,
) -> Self
fn new<'tcx>( tcx: TyCtxt<'tcx>, def_id: DefId, body: &Body<'tcx>, graph: &PathGraph<'_>, component: &LoopComponent, ) -> Self
Build a numeric summary for component.
Auto Trait Implementations§
impl DynSend for LoopNumericSummary
impl DynSync for LoopNumericSummary
impl Freeze for LoopNumericSummary
impl RefUnwindSafe for LoopNumericSummary
impl Send for LoopNumericSummary
impl Sync for LoopNumericSummary
impl Unpin for LoopNumericSummary
impl UnsafeUnpin for LoopNumericSummary
impl UnwindSafe for LoopNumericSummary
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
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
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 more