Skip to content

Commit 42f65e9

Browse files
committed
Avoid recomputing the constraint graph
1 parent 2146760 commit 42f65e9

5 files changed

Lines changed: 45 additions & 20 deletions

File tree

compiler/rustc_borrowck/src/handle_placeholders.rs

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ use rustc_middle::mir::ConstraintCategory;
1010
use rustc_middle::ty::{RegionVid, UniverseIndex};
1111
use tracing::{debug, trace};
1212

13+
use crate::constraints::graph::NormalConstraintGraph;
1314
use crate::constraints::{ConstraintSccIndex, OutlivesConstraintSet};
1415
use crate::consumers::OutlivesConstraint;
1516
use crate::region_infer::values::LivenessValues;
@@ -26,6 +27,7 @@ pub(crate) struct LoweredConstraints<'tcx> {
2627
pub(crate) constraint_sccs: Sccs<RegionVid, ConstraintSccIndex>,
2728
pub(crate) definitions: Frozen<IndexVec<RegionVid, RegionDefinition<'tcx>>>,
2829
pub(crate) scc_annotations: IndexVec<ConstraintSccIndex, RegionTracker>,
30+
pub(crate) constraint_graph: NormalConstraintGraph,
2931
}
3032

3133
pub(crate) type RegionDefinitions<'tcx> = IndexVec<RegionVid, RegionDefinition<'tcx>>;
@@ -243,17 +245,19 @@ pub(crate) fn compute_sccs_applying_placeholder_outlives_constraints<'tcx>(
243245
region_definitions(infcx, universal_regions, liveness_constraints);
244246

245247
let fr_static = universal_regions.fr_static;
246-
let compute_sccs =
247-
|constraints: &OutlivesConstraintSet<'tcx>,
248-
annotations: &mut SccAnnotations<'_, 'tcx, RegionTracker>| {
249-
ConstraintSccs::new_with_annotation(
250-
&constraints.graph(definitions.len()).region_graph(constraints, fr_static),
251-
annotations,
252-
)
253-
};
248+
let constraint_graph = outlives_constraints.graph(definitions.len());
249+
let compute_sccs = |constraints: &OutlivesConstraintSet<'tcx>,
250+
annotations: &mut SccAnnotations<'_, 'tcx, RegionTracker>,
251+
constraint_graph: &NormalConstraintGraph| {
252+
ConstraintSccs::new_with_annotation(
253+
&constraint_graph.region_graph(constraints, fr_static),
254+
annotations,
255+
)
256+
};
254257

255258
let mut scc_annotations = SccAnnotations::init(&definitions);
256-
let constraint_sccs = compute_sccs(&outlives_constraints, &mut scc_annotations);
259+
let constraint_sccs =
260+
compute_sccs(&outlives_constraints, &mut scc_annotations, &constraint_graph);
257261

258262
// This code structure is a bit convoluted because it allows for a planned
259263
// future change where the early return here has a different type of annotation
@@ -265,6 +269,7 @@ pub(crate) fn compute_sccs_applying_placeholder_outlives_constraints<'tcx>(
265269
constraint_sccs,
266270
scc_annotations: scc_annotations.scc_to_annotation,
267271
definitions,
272+
constraint_graph,
268273
};
269274
}
270275
debug!("Placeholders present; activating placeholder handling logic!");
@@ -276,21 +281,26 @@ pub(crate) fn compute_sccs_applying_placeholder_outlives_constraints<'tcx>(
276281
outlives_constraints,
277282
);
278283

279-
let (constraint_sccs, scc_annotations) = if added_constraints {
284+
let (constraint_sccs, scc_annotations, constraint_graph) = if added_constraints {
280285
let mut annotations = SccAnnotations::init(&definitions);
286+
let constraint_graph = outlives_constraints.graph(definitions.len());
281287

282288
// We changed the constraint set and so must recompute SCCs.
283289
// Optimisation opportunity: if we can add them incrementally (and that's
284290
// possible because edges to 'static always only merge SCCs into 'static),
285291
// we would potentially save a lot of work here.
286-
(compute_sccs(&outlives_constraints, &mut annotations), annotations.scc_to_annotation)
292+
(
293+
compute_sccs(&outlives_constraints, &mut annotations, &constraint_graph),
294+
annotations.scc_to_annotation,
295+
constraint_graph,
296+
)
287297
} else {
288298
// If we didn't add any back-edges; no more work needs doing
289299
debug!("No constraints rewritten!");
290-
(constraint_sccs, scc_annotations.scc_to_annotation)
300+
(constraint_sccs, scc_annotations.scc_to_annotation, constraint_graph)
291301
};
292302

293-
LoweredConstraints { constraint_sccs, definitions, scc_annotations }
303+
LoweredConstraints { constraint_sccs, definitions, scc_annotations, constraint_graph }
294304
}
295305

296306
pub(crate) fn rewrite_placeholder_outlives<'tcx>(

compiler/rustc_borrowck/src/lib.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -440,6 +440,7 @@ fn borrowck_check_region_constraints<'tcx>(
440440
outlives_constraints,
441441
universe_causes,
442442
live_loans,
443+
outlives_constraint_graph,
443444
} = nll::compute_regions(
444445
root_cx,
445446
&infcx,
@@ -528,7 +529,7 @@ fn borrowck_check_region_constraints<'tcx>(
528529
definitions: &definitions,
529530
universal_region_relations: &universal_region_relations,
530531
outlives_constraints: &outlives_constraints,
531-
constraint_graph: outlives_constraints.graph(definitions.len()),
532+
constraint_graph: &outlives_constraint_graph,
532533
liveness_constraints: &liveness_constraints,
533534
universe_causes: &universe_causes,
534535
};
@@ -573,7 +574,7 @@ fn borrowck_check_region_constraints<'tcx>(
573574
definitions: &definitions,
574575
universal_region_relations: &universal_region_relations,
575576
outlives_constraints: &outlives_constraints,
576-
constraint_graph: outlives_constraints.graph(definitions.len()),
577+
constraint_graph: &outlives_constraint_graph,
577578
liveness_constraints: &liveness_constraints,
578579
universe_causes: &universe_causes,
579580
};
@@ -841,7 +842,7 @@ pub(crate) struct MirBorrowckCtxt<'a, 'infcx, 'tcx> {
841842
definitions: &'a IndexVec<RegionVid, RegionDefinition<'tcx>>,
842843

843844
universal_region_relations: &'a Frozen<UniversalRegionRelations<'tcx>>,
844-
constraint_graph: NormalConstraintGraph,
845+
constraint_graph: &'a NormalConstraintGraph,
845846
outlives_constraints: &'a OutlivesConstraintSet<'tcx>,
846847
liveness_constraints: &'a LivenessValues,
847848

compiler/rustc_borrowck/src/nll.rs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ use tracing::{debug, instrument};
2121

2222
use crate::borrow_set::BorrowSet;
2323
use crate::constraints::OutlivesConstraintSet;
24+
use crate::constraints::graph::NormalConstraintGraph;
2425
use crate::consumers::RustcFacts;
2526
use crate::diagnostics::{RegionErrors, UniverseInfo};
2627
use crate::handle_placeholders::{
@@ -53,6 +54,7 @@ pub(crate) struct NllOutput<'tcx> {
5354
pub(crate) liveness_constraints: LivenessValues,
5455
pub(crate) outlives_constraints: Frozen<OutlivesConstraintSet<'tcx>>,
5556
pub(crate) universe_causes: FxIndexMap<ty::UniverseIndex, UniverseInfo<'tcx>>,
57+
pub(crate) outlives_constraint_graph: NormalConstraintGraph,
5658

5759
/// When using `-Zpolonius=next`: the data used to compute errors and diagnostics, e.g.
5860
/// localized typeck and liveness constraints.
@@ -100,7 +102,7 @@ pub(crate) fn compute_closure_requirements_modulo_opaques<'tcx>(
100102
universal_region_relations: Rc<Frozen<UniversalRegionRelations<'tcx>>>,
101103
constraints: &mut MirTypeckRegionConstraints<'tcx>,
102104
) -> Option<ClosureRegionRequirements<'tcx>> {
103-
let LoweredConstraints { constraint_sccs, definitions, scc_annotations } =
105+
let LoweredConstraints { constraint_sccs, definitions, scc_annotations, constraint_graph } =
104106
compute_sccs_applying_placeholder_outlives_constraints(
105107
&mut constraints.liveness_constraints,
106108
&mut constraints.outlives_constraints,
@@ -122,6 +124,7 @@ pub(crate) fn compute_closure_requirements_modulo_opaques<'tcx>(
122124
None,
123125
location_map,
124126
constraints.placeholder_indices.clone(),
127+
&constraint_graph,
125128
);
126129
closure_region_requirements
127130
}
@@ -175,7 +178,12 @@ pub(crate) fn compute_regions<'tcx>(
175178
&outlives_constraints,
176179
);
177180

178-
let LoweredConstraints { constraint_sccs, definitions, scc_annotations } = lowered_constraints;
181+
let LoweredConstraints {
182+
constraint_sccs,
183+
definitions,
184+
scc_annotations,
185+
constraint_graph: outlives_constraint_graph,
186+
} = lowered_constraints;
179187

180188
// If requested for `-Zpolonius=next`, convert NLL constraints to localized outlives constraints
181189
// and use them to compute loan liveness.
@@ -225,6 +233,7 @@ pub(crate) fn compute_regions<'tcx>(
225233
polonius_output.clone(),
226234
location_map,
227235
placeholder_indices,
236+
&outlives_constraint_graph,
228237
);
229238

230239
NllOutput {
@@ -239,6 +248,7 @@ pub(crate) fn compute_regions<'tcx>(
239248
outlives_constraints,
240249
universe_causes,
241250
live_loans,
251+
outlives_constraint_graph,
242252
}
243253
}
244254

compiler/rustc_borrowck/src/region_infer/mod.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ use rustc_mir_dataflow::points::DenseLocationMap;
1515
use rustc_span::Span;
1616
use tracing::{Level, debug, enabled, instrument};
1717

18+
use crate::constraints::graph::NormalConstraintGraph;
1819
use crate::constraints::{ConstraintSccIndex, OutlivesConstraintSet};
1920
use crate::diagnostics::{RegionErrorKind, RegionErrors};
2021
use crate::handle_placeholders::{RegionDefinitions, RegionTracker};
@@ -777,6 +778,7 @@ impl<'a, 'tcx> RegionInferenceContext<'a, 'tcx> {
777778
polonius_output: Option<Box<PoloniusOutput>>,
778779
location_map: Rc<DenseLocationMap>,
779780
placeholder_indices: PlaceholderIndices<'tcx>,
781+
outlives_constraint_graph: &'a NormalConstraintGraph,
780782
) -> (Option<ClosureRegionRequirements<'tcx>>, RegionErrors<'tcx>, InferredRegions<'tcx>) {
781783
let num_external_vids =
782784
universal_region_relations.universal_regions.num_global_and_external_regions();
@@ -826,6 +828,7 @@ impl<'a, 'tcx> RegionInferenceContext<'a, 'tcx> {
826828
outlives_constraints,
827829
&scc_values,
828830
regioncx.liveness_constraints,
831+
outlives_constraint_graph,
829832
)
830833
.check(polonius_output, propagated_outlives_requirements.as_mut());
831834

compiler/rustc_borrowck/src/region_infer/universal_regions.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ pub(crate) struct UniversalRegionChecker<'a, 'tcx> {
3232
constraints: &'a OutlivesConstraintSet<'tcx>,
3333
fr_static: RegionVid,
3434
values: &'a InferredRegions<'tcx>,
35-
constraint_graph: NormalConstraintGraph,
35+
constraint_graph: &'a NormalConstraintGraph,
3636
liveness_constraints: &'a LivenessValues,
3737
}
3838

@@ -61,13 +61,14 @@ impl<'a, 'tcx> UniversalRegionChecker<'a, 'tcx> {
6161
constraints: &'a OutlivesConstraintSet<'tcx>,
6262
values: &'a InferredRegions<'tcx>,
6363
liveness_constraints: &'a LivenessValues,
64+
constraint_graph: &'a NormalConstraintGraph,
6465
) -> Self {
6566
Self {
6667
errors_buffer,
6768
region_definitions,
6869
constraints,
6970
fr_static: values.universal_region_relations.universal_regions.fr_static,
70-
constraint_graph: constraints.graph(region_definitions.len()),
71+
constraint_graph,
7172
values,
7273
liveness_constraints,
7374
}

0 commit comments

Comments
 (0)