1
Fork 0

simplify add_extra_drop_facts

this is mostly to remove imports of the polonius legacy module

also what is going on in this function, what the...
This commit is contained in:
Rémy Rakic 2024-12-29 23:54:57 +00:00
parent 50c152f347
commit fbf48c177b
3 changed files with 20 additions and 25 deletions

View file

@ -246,6 +246,6 @@ impl FactCell for RegionVid {
impl FactCell for LocationIndex {
fn to_string(&self, location_table: &LocationTable) -> String {
format!("{:?}", location_table.to_location(*self))
format!("{:?}", location_table.to_rich_location(*self))
}
}

View file

@ -65,7 +65,7 @@ impl LocationTable {
LocationIndex::from_usize(start_index + statement_index * 2 + 1)
}
pub fn to_location(&self, index: LocationIndex) -> RichLocation {
pub fn to_rich_location(&self, index: LocationIndex) -> RichLocation {
let point_index = index.index();
// Find the basic block. We have a vector with the
@ -97,6 +97,13 @@ impl LocationTable {
RichLocation::Mid(Location { block, statement_index })
}
}
pub fn to_location(&self, index: LocationIndex) -> Location {
match self.to_rich_location(index) {
RichLocation::Start(location) => location,
RichLocation::Mid(location) => location,
}
}
}
impl LocationIndex {

View file

@ -16,7 +16,6 @@ use rustc_trait_selection::traits::query::type_op::{DropckOutlives, TypeOp, Type
use tracing::debug;
use crate::polonius;
use crate::polonius::legacy::RichLocation;
use crate::region_infer::values::{self, LiveLoans};
use crate::type_check::liveness::local_use_map::LocalUseMap;
use crate::type_check::{NormalizeLocation, TypeChecker};
@ -211,7 +210,7 @@ impl<'a, 'typeck, 'b, 'tcx> LivenessResults<'a, 'typeck, 'b, 'tcx> {
///
/// Add facts for all locals with free regions, since regions may outlive
/// the function body only at certain nodes in the CFG.
fn add_extra_drop_facts(&mut self, relevant_live_locals: &[Local]) -> Option<()> {
fn add_extra_drop_facts(&mut self, relevant_live_locals: &[Local]) {
// This collect is more necessary than immediately apparent
// because these facts go into `add_drop_live_facts_for()`,
// which also writes to `all_facts`, and so this is genuinely
@ -221,41 +220,30 @@ impl<'a, 'typeck, 'b, 'tcx> LivenessResults<'a, 'typeck, 'b, 'tcx> {
// and probably maybe plausibly does not need to go back in.
// It may be necessary to just pick out the parts of
// `add_drop_live_facts_for()` that make sense.
let Some(facts) = self.cx.typeck.all_facts.as_ref() else { return };
let facts_to_add: Vec<_> = {
let drop_used = &self.cx.typeck.all_facts.as_ref()?.var_dropped_at;
let relevant_live_locals: FxIndexSet<_> =
relevant_live_locals.iter().copied().collect();
drop_used
facts
.var_dropped_at
.iter()
.filter_map(|(local, location_index)| {
let local_ty = self.cx.body.local_decls[*local].ty;
if relevant_live_locals.contains(local) || !local_ty.has_free_regions() {
.filter_map(|&(local, location_index)| {
let local_ty = self.cx.body.local_decls[local].ty;
if relevant_live_locals.contains(&local) || !local_ty.has_free_regions() {
return None;
}
let location = match self.cx.typeck.location_table.to_location(*location_index)
{
RichLocation::Start(l) => l,
RichLocation::Mid(l) => l,
};
Some((*local, local_ty, location))
let location = self.cx.typeck.location_table.to_location(location_index);
Some((local, local_ty, location))
})
.collect()
};
// FIXME: these locations seem to have a special meaning (e.g. everywhere, at the end,
// ...), but I don't know which one. Please help me rename it to something descriptive!
// Also, if this IntervalSet is used in many places, it maybe should have a newtype'd
// name with a description of what it means for future mortals passing by.
let locations = IntervalSet::new(self.cx.elements.num_points());
let live_at = IntervalSet::new(self.cx.elements.num_points());
for (local, local_ty, location) in facts_to_add {
self.cx.add_drop_live_facts_for(local, local_ty, &[location], &locations);
self.cx.add_drop_live_facts_for(local, local_ty, &[location], &live_at);
}
Some(())
}
/// Clear the value of fields that are "per local variable".