Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion compiler/rustc_borrowck/src/nll.rs
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,15 @@ pub(crate) fn compute_regions<'tcx>(
// If requested for `-Zpolonius=next`, convert NLL constraints to localized outlives constraints
// and use them to compute loan liveness.
let polonius_diagnostics = polonius_context.map(|polonius_context| {
polonius_context.compute_loan_liveness(infcx.tcx, &mut regioncx, body, borrow_set)
// let _timer = std::time::Instant::now();
let ret =
polonius_context.compute_loan_liveness(infcx.tcx, &mut regioncx, body, borrow_set);
// eprintln!(
// "compute_loan_liveness took: {} ns, {:?}, borrows: {}, localized constraints: {}",
// _timer.elapsed().as_nanos(),
// body.span, borrow_set.len(), ret.localized_outlives_constraints.outlives.len(),
// );
ret
});

// If requested: dump NLL facts, and run legacy polonius analysis.
Expand Down
35 changes: 28 additions & 7 deletions compiler/rustc_borrowck/src/polonius/constraints.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
use rustc_middle::ty::RegionVid;
use rustc_mir_dataflow::points::PointIndex;

use crate::region_infer::values::LivenessValues;

/// A localized outlives constraint reifies the CFG location where the outlives constraint holds,
/// within the origins themselves as if they were different from point to point: from `a: b`
/// outlives constraints to `a@p: b@p`, where `p` is the point in the CFG.
Expand All @@ -23,6 +25,25 @@ pub(crate) struct LocalizedOutlivesConstraint {
pub from: PointIndex,
pub target: RegionVid,
pub to: PointIndex,
pub tag: &'static str,
}

impl rustc_mir_dataflow::fmt::DebugWithContext<LivenessValues> for LocalizedOutlivesConstraint {
fn fmt_with(
&self,
liveness: &LivenessValues,
fmt: &mut std::fmt::Formatter<'_>,
) -> std::fmt::Result {
write!(
fmt,
"{}@{:?} -> {}@{:?} ({})",
self.source.as_u32(),
liveness.location_from_point(self.from),
self.target.as_u32(),
liveness.location_from_point(self.to),
self.tag,
)
}
}

/// A container of [LocalizedOutlivesConstraint]s that can be turned into a traversable
Expand All @@ -33,11 +54,11 @@ pub(crate) struct LocalizedOutlivesConstraintSet {
}

impl LocalizedOutlivesConstraintSet {
pub(crate) fn push(&mut self, constraint: LocalizedOutlivesConstraint) {
if constraint.source == constraint.target && constraint.from == constraint.to {
// 'a@p: 'a@p is pretty uninteresting
return;
}
self.outlives.push(constraint);
}
// pub(crate) fn push(&mut self, constraint: LocalizedOutlivesConstraint) {
// if constraint.source == constraint.target && constraint.from == constraint.to {
// // 'a@p: 'a@p is pretty uninteresting
// return;
// }
// self.outlives.push(constraint);
// }
}
2 changes: 1 addition & 1 deletion compiler/rustc_borrowck/src/polonius/dump.rs
Original file line number Diff line number Diff line change
Expand Up @@ -216,7 +216,7 @@ fn emit_polonius_mir<'tcx>(
writeln!(out, "| Localized constraints")?;

for constraint in &localized_outlives_constraints.outlives {
let LocalizedOutlivesConstraint { source, from, target, to } = constraint;
let LocalizedOutlivesConstraint { source, from, target, to, .. } = constraint;
let from = liveness.location_from_point(*from);
let to = liveness.location_from_point(*to);
writeln!(out, "| {source:?} at {from:?} -> {target:?} at {to:?}")?;
Expand Down
Loading
Loading