Auto merge of #119499 - cjgillot:dtm-opt, r=nnethercote
Two small bitset optimisations
This commit is contained in:
commit
efb3f11087
@ -1699,14 +1699,15 @@ impl<R: Idx, C: Idx> BitMatrix<R, C> {
|
|||||||
let (read_start, read_end) = self.range(read);
|
let (read_start, read_end) = self.range(read);
|
||||||
let (write_start, write_end) = self.range(write);
|
let (write_start, write_end) = self.range(write);
|
||||||
let words = &mut self.words[..];
|
let words = &mut self.words[..];
|
||||||
let mut changed = false;
|
let mut changed = 0;
|
||||||
for (read_index, write_index) in iter::zip(read_start..read_end, write_start..write_end) {
|
for (read_index, write_index) in iter::zip(read_start..read_end, write_start..write_end) {
|
||||||
let word = words[write_index];
|
let word = words[write_index];
|
||||||
let new_word = word | words[read_index];
|
let new_word = word | words[read_index];
|
||||||
words[write_index] = new_word;
|
words[write_index] = new_word;
|
||||||
changed |= word != new_word;
|
// See `bitwise` for the rationale.
|
||||||
|
changed |= word ^ new_word;
|
||||||
}
|
}
|
||||||
changed
|
changed != 0
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Adds the bits from `with` to the bits from row `write`, and
|
/// Adds the bits from `with` to the bits from row `write`, and
|
||||||
@ -1715,14 +1716,7 @@ impl<R: Idx, C: Idx> BitMatrix<R, C> {
|
|||||||
assert!(write.index() < self.num_rows);
|
assert!(write.index() < self.num_rows);
|
||||||
assert_eq!(with.domain_size(), self.num_columns);
|
assert_eq!(with.domain_size(), self.num_columns);
|
||||||
let (write_start, write_end) = self.range(write);
|
let (write_start, write_end) = self.range(write);
|
||||||
let mut changed = false;
|
bitwise(&mut self.words[write_start..write_end], &with.words, |a, b| a | b)
|
||||||
for (read_index, write_index) in iter::zip(0..with.words.len(), write_start..write_end) {
|
|
||||||
let word = self.words[write_index];
|
|
||||||
let new_word = word | with.words[read_index];
|
|
||||||
self.words[write_index] = new_word;
|
|
||||||
changed |= word != new_word;
|
|
||||||
}
|
|
||||||
changed
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Sets every cell in `row` to true.
|
/// Sets every cell in `row` to true.
|
||||||
|
@ -942,6 +942,7 @@ fn compute_storage_conflicts<'mir, 'tcx>(
|
|||||||
body,
|
body,
|
||||||
saved_locals: saved_locals,
|
saved_locals: saved_locals,
|
||||||
local_conflicts: BitMatrix::from_row_n(&ineligible_locals, body.local_decls.len()),
|
local_conflicts: BitMatrix::from_row_n(&ineligible_locals, body.local_decls.len()),
|
||||||
|
eligible_storage_live: BitSet::new_empty(body.local_decls.len()),
|
||||||
};
|
};
|
||||||
|
|
||||||
requires_storage.visit_reachable_with(body, &mut visitor);
|
requires_storage.visit_reachable_with(body, &mut visitor);
|
||||||
@ -978,6 +979,8 @@ struct StorageConflictVisitor<'mir, 'tcx, 's> {
|
|||||||
// FIXME(tmandry): Consider using sparse bitsets here once we have good
|
// FIXME(tmandry): Consider using sparse bitsets here once we have good
|
||||||
// benchmarks for coroutines.
|
// benchmarks for coroutines.
|
||||||
local_conflicts: BitMatrix<Local, Local>,
|
local_conflicts: BitMatrix<Local, Local>,
|
||||||
|
// We keep this bitset as a buffer to avoid reallocating memory.
|
||||||
|
eligible_storage_live: BitSet<Local>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'mir, 'tcx, R> rustc_mir_dataflow::ResultsVisitor<'mir, 'tcx, R>
|
impl<'mir, 'tcx, R> rustc_mir_dataflow::ResultsVisitor<'mir, 'tcx, R>
|
||||||
@ -1009,19 +1012,19 @@ impl<'mir, 'tcx, R> rustc_mir_dataflow::ResultsVisitor<'mir, 'tcx, R>
|
|||||||
impl StorageConflictVisitor<'_, '_, '_> {
|
impl StorageConflictVisitor<'_, '_, '_> {
|
||||||
fn apply_state(&mut self, flow_state: &BitSet<Local>, loc: Location) {
|
fn apply_state(&mut self, flow_state: &BitSet<Local>, loc: Location) {
|
||||||
// Ignore unreachable blocks.
|
// Ignore unreachable blocks.
|
||||||
if self.body.basic_blocks[loc.block].terminator().kind == TerminatorKind::Unreachable {
|
if let TerminatorKind::Unreachable = self.body.basic_blocks[loc.block].terminator().kind {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut eligible_storage_live = flow_state.clone();
|
self.eligible_storage_live.clone_from(flow_state);
|
||||||
eligible_storage_live.intersect(&**self.saved_locals);
|
self.eligible_storage_live.intersect(&**self.saved_locals);
|
||||||
|
|
||||||
for local in eligible_storage_live.iter() {
|
for local in self.eligible_storage_live.iter() {
|
||||||
self.local_conflicts.union_row_with(&eligible_storage_live, local);
|
self.local_conflicts.union_row_with(&self.eligible_storage_live, local);
|
||||||
}
|
}
|
||||||
|
|
||||||
if eligible_storage_live.count() > 1 {
|
if self.eligible_storage_live.count() > 1 {
|
||||||
trace!("at {:?}, eligible_storage_live={:?}", loc, eligible_storage_live);
|
trace!("at {:?}, eligible_storage_live={:?}", loc, self.eligible_storage_live);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user