perf: Merge region_obligations snapshotting into the undo log

This commit is contained in:
Markus Westerlind 2020-02-25 14:45:07 +01:00
parent 04f5d54d13
commit f45d852dcc
3 changed files with 23 additions and 21 deletions

View File

@ -196,7 +196,7 @@ pub struct InferCtxtInner<'tcx> {
/// for each body-id in this map, which will process the
/// obligations within. This is expected to be done 'late enough'
/// that all type inference variables have been bound and so forth.
pub region_obligations: Vec<(hir::HirId, RegionObligation<'tcx>)>,
region_obligations: Vec<(hir::HirId, RegionObligation<'tcx>)>,
}
impl<'tcx> InferCtxtInner<'tcx> {
@ -213,6 +213,10 @@ impl<'tcx> InferCtxtInner<'tcx> {
}
}
pub fn region_obligations(&self) -> &[(hir::HirId, RegionObligation<'tcx>)] {
&self.region_obligations
}
pub(crate) fn projection_cache(&mut self) -> traits::ProjectionCache<'tcx, '_> {
self.projection_cache.with_log(&mut self.undo_log)
}
@ -270,6 +274,7 @@ pub(crate) enum UndoLog<'tcx> {
RegionConstraintCollector(region_constraints::UndoLog<'tcx>),
RegionUnificationTable(sv::UndoLog<ut::Delegate<ty::RegionVid>>),
ProjectionCache(traits::UndoLog<'tcx>),
PushRegionObligation,
}
impl<'tcx> From<region_constraints::UndoLog<'tcx>> for UndoLog<'tcx> {
@ -348,6 +353,7 @@ struct RollbackView<'tcx, 'a> {
float_unification_table: &'a mut ut::UnificationStorage<ty::FloatVid>,
region_constraints: &'a mut RegionConstraintStorage<'tcx>,
projection_cache: &'a mut traits::ProjectionCacheStorage<'tcx>,
region_obligations: &'a mut Vec<(hir::HirId, RegionObligation<'tcx>)>,
}
impl<'tcx> Rollback<UndoLog<'tcx>> for RollbackView<'tcx, '_> {
@ -362,6 +368,9 @@ impl<'tcx> Rollback<UndoLog<'tcx>> for RollbackView<'tcx, '_> {
self.region_constraints.unification_table.reverse(undo)
}
UndoLog::ProjectionCache(undo) => self.projection_cache.reverse(undo),
UndoLog::PushRegionObligation => {
self.region_obligations.pop();
}
}
}
}
@ -915,7 +924,6 @@ pub struct FullSnapshot<'a, 'tcx> {
#[must_use = "once you start a snapshot, you should always consume it"]
pub struct CombinedSnapshot<'a, 'tcx> {
undo_snapshot: Snapshot<'tcx>,
region_obligations_snapshot: usize,
universe: ty::UniverseIndex,
was_in_snapshot: bool,
_in_progress_tables: Option<Ref<'a, ty::TypeckTables<'tcx>>>,
@ -1052,7 +1060,6 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
let undo_snapshot = Snapshot { undo_len: inner.undo_log.logs.len(), _marker: PhantomData };
CombinedSnapshot {
undo_snapshot,
region_obligations_snapshot: inner.region_obligations.len(),
universe: self.universe(),
was_in_snapshot: in_snapshot,
// Borrow tables "in progress" (i.e., during typeck)
@ -1063,13 +1070,8 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
fn rollback_to(&self, cause: &str, snapshot: CombinedSnapshot<'a, 'tcx>) {
debug!("rollback_to(cause={})", cause);
let CombinedSnapshot {
undo_snapshot,
region_obligations_snapshot,
universe,
was_in_snapshot,
_in_progress_tables,
} = snapshot;
let CombinedSnapshot { undo_snapshot, universe, was_in_snapshot, _in_progress_tables } =
snapshot;
self.in_snapshot.set(was_in_snapshot);
self.universe.set(universe);
@ -1093,21 +1095,16 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
float_unification_table,
region_constraints: region_constraints.as_mut().unwrap(),
projection_cache,
region_obligations,
},
undo_snapshot,
);
region_obligations.truncate(region_obligations_snapshot);
}
fn commit_from(&self, snapshot: CombinedSnapshot<'a, 'tcx>) {
debug!("commit_from()");
let CombinedSnapshot {
undo_snapshot,
region_obligations_snapshot: _,
universe: _,
was_in_snapshot,
_in_progress_tables,
} = snapshot;
let CombinedSnapshot { undo_snapshot, universe: _, was_in_snapshot, _in_progress_tables } =
snapshot;
self.in_snapshot.set(was_in_snapshot);

View File

@ -61,7 +61,10 @@
use crate::infer::outlives::env::RegionBoundPairs;
use crate::infer::outlives::verify::VerifyBoundCx;
use crate::infer::{self, GenericKind, InferCtxt, RegionObligation, SubregionOrigin, VerifyBound};
use crate::infer::{
self, GenericKind, InferCtxt, RegionObligation, SubregionOrigin, UndoLog, VerifyBound,
};
use crate::rustc_data_structures::undo_log::UndoLogs;
use crate::traits::ObligationCause;
use rustc_middle::ty::outlives::Component;
use rustc_middle::ty::subst::GenericArgKind;
@ -84,7 +87,9 @@ impl<'cx, 'tcx> InferCtxt<'cx, 'tcx> {
) {
debug!("register_region_obligation(body_id={:?}, obligation={:?})", body_id, obligation);
self.inner.borrow_mut().region_obligations.push((body_id, obligation));
let mut inner = self.inner.borrow_mut();
inner.undo_log.push(UndoLog::PushRegionObligation);
inner.region_obligations.push((body_id, obligation));
}
pub fn register_region_obligation_with_cause(

View File

@ -195,7 +195,7 @@ impl<'tcx> AutoTraitFinder<'tcx> {
let body_id_map: FxHashMap<_, _> = infcx
.inner
.borrow()
.region_obligations
.region_obligations()
.iter()
.map(|&(id, _)| (id, vec![]))
.collect();