Auto merge of #51869 - nnethercote:rm-clone_from, r=nikomatsakis
Avoid needless allocations in `liveness_of_locals`. We don't need to replace the heap-allocated bitset, we can just overwrite its contents. This speeds up most NLL benchmarks, the best by 1.5%. r? @nikomatsakis
This commit is contained in:
commit
e953e4621e
4 changed files with 7 additions and 5 deletions
|
@ -233,7 +233,9 @@ impl<T: Idx> IdxSet<T> {
|
||||||
&mut self.bits
|
&mut self.bits
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn clone_from(&mut self, other: &IdxSet<T>) {
|
/// Efficiently overwrite `self` with `other`. Panics if `self` and `other`
|
||||||
|
/// don't have the same length.
|
||||||
|
pub fn overwrite(&mut self, other: &IdxSet<T>) {
|
||||||
self.words_mut().clone_from_slice(other.words());
|
self.words_mut().clone_from_slice(other.words());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -139,7 +139,7 @@ impl<BD> FlowsAtLocation for FlowAtLocation<BD>
|
||||||
where BD: BitDenotation
|
where BD: BitDenotation
|
||||||
{
|
{
|
||||||
fn reset_to_entry_of(&mut self, bb: BasicBlock) {
|
fn reset_to_entry_of(&mut self, bb: BasicBlock) {
|
||||||
(*self.curr_state).clone_from(self.base_results.sets().on_entry_set_for(bb.index()));
|
self.curr_state.overwrite(self.base_results.sets().on_entry_set_for(bb.index()));
|
||||||
}
|
}
|
||||||
|
|
||||||
fn reconstruct_statement_effect(&mut self, loc: Location) {
|
fn reconstruct_statement_effect(&mut self, loc: Location) {
|
||||||
|
|
|
@ -242,7 +242,7 @@ impl<'b, 'a: 'b, 'tcx: 'a, BD> PropagationContext<'b, 'a, 'tcx, BD> where BD: Bi
|
||||||
{
|
{
|
||||||
let sets = builder.flow_state.sets.for_block(bb_idx);
|
let sets = builder.flow_state.sets.for_block(bb_idx);
|
||||||
debug_assert!(in_out.words().len() == sets.on_entry.words().len());
|
debug_assert!(in_out.words().len() == sets.on_entry.words().len());
|
||||||
in_out.clone_from(sets.on_entry);
|
in_out.overwrite(sets.on_entry);
|
||||||
in_out.union(sets.gen_set);
|
in_out.union(sets.gen_set);
|
||||||
in_out.subtract(sets.kill_set);
|
in_out.subtract(sets.kill_set);
|
||||||
}
|
}
|
||||||
|
|
|
@ -141,14 +141,14 @@ pub fn liveness_of_locals<'tcx>(mir: &Mir<'tcx>, mode: LivenessMode) -> Liveness
|
||||||
for &successor in mir.basic_blocks()[b].terminator().successors() {
|
for &successor in mir.basic_blocks()[b].terminator().successors() {
|
||||||
bits.union(&ins[successor]);
|
bits.union(&ins[successor]);
|
||||||
}
|
}
|
||||||
outs[b].clone_from(&bits);
|
outs[b].overwrite(&bits);
|
||||||
|
|
||||||
// bits = use ∪ (bits - def)
|
// bits = use ∪ (bits - def)
|
||||||
def_use[b].apply(&mut bits);
|
def_use[b].apply(&mut bits);
|
||||||
|
|
||||||
// update bits on entry and flag if they have changed
|
// update bits on entry and flag if they have changed
|
||||||
if ins[b] != bits {
|
if ins[b] != bits {
|
||||||
ins[b].clone_from(&bits);
|
ins[b].overwrite(&bits);
|
||||||
changed = true;
|
changed = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue