1
Fork 0

Remove more PlaceBuilder clones

This commit is contained in:
Cameron Steffen 2022-11-03 12:07:09 -05:00
parent 105abe39c0
commit 9cf6ce070d
6 changed files with 26 additions and 21 deletions

View file

@ -315,6 +315,14 @@ impl<'tcx> PlaceBuilder<'tcx> {
self.projection.push(elem); self.projection.push(elem);
self self
} }
/// Same as `.clone().project(..)` but more efficient
pub(crate) fn clone_project(&self, elem: PlaceElem<'tcx>) -> Self {
Self {
base: self.base,
projection: Vec::from_iter(self.projection.iter().copied().chain([elem])),
}
}
} }
impl<'tcx> From<Local> for PlaceBuilder<'tcx> { impl<'tcx> From<Local> for PlaceBuilder<'tcx> {

View file

@ -363,10 +363,8 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
.map(|(n, ty)| match fields_map.get(&n) { .map(|(n, ty)| match fields_map.get(&n) {
Some(v) => v.clone(), Some(v) => v.clone(),
None => { None => {
let place_builder = place_builder.clone(); let place = place_builder.clone_project(PlaceElem::Field(n, *ty));
this.consume_by_copy_or_move( this.consume_by_copy_or_move(place.to_place(this))
place_builder.field(n, *ty).to_place(this),
)
} }
}) })
.collect() .collect()

View file

@ -168,7 +168,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
let scrutinee_place = let scrutinee_place =
unpack!(block = self.lower_scrutinee(block, scrutinee, scrutinee_span,)); unpack!(block = self.lower_scrutinee(block, scrutinee, scrutinee_span,));
let mut arm_candidates = self.create_match_candidates(scrutinee_place.clone(), &arms); let mut arm_candidates = self.create_match_candidates(&scrutinee_place, &arms);
let match_has_guard = arm_candidates.iter().any(|(_, candidate)| candidate.has_guard); let match_has_guard = arm_candidates.iter().any(|(_, candidate)| candidate.has_guard);
let mut candidates = let mut candidates =
@ -230,7 +230,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
/// Create the initial `Candidate`s for a `match` expression. /// Create the initial `Candidate`s for a `match` expression.
fn create_match_candidates<'pat>( fn create_match_candidates<'pat>(
&mut self, &mut self,
scrutinee: PlaceBuilder<'tcx>, scrutinee: &PlaceBuilder<'tcx>,
arms: &'pat [ArmId], arms: &'pat [ArmId],
) -> Vec<(&'pat Arm<'tcx>, Candidate<'pat, 'tcx>)> ) -> Vec<(&'pat Arm<'tcx>, Candidate<'pat, 'tcx>)>
where where
@ -1332,7 +1332,6 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
bug!("Or-patterns should have been sorted to the end"); bug!("Or-patterns should have been sorted to the end");
}; };
let or_span = match_pair.pattern.span; let or_span = match_pair.pattern.span;
let place = match_pair.place;
first_candidate.visit_leaves(|leaf_candidate| { first_candidate.visit_leaves(|leaf_candidate| {
self.test_or_pattern( self.test_or_pattern(
@ -1340,7 +1339,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
&mut otherwise, &mut otherwise,
pats, pats,
or_span, or_span,
place.clone(), &match_pair.place,
fake_borrows, fake_borrows,
); );
}); });
@ -1368,7 +1367,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
otherwise: &mut Option<BasicBlock>, otherwise: &mut Option<BasicBlock>,
pats: &'pat [Box<Pat<'tcx>>], pats: &'pat [Box<Pat<'tcx>>],
or_span: Span, or_span: Span,
place: PlaceBuilder<'tcx>, place: &PlaceBuilder<'tcx>,
fake_borrows: &mut Option<FxIndexSet<Place<'tcx>>>, fake_borrows: &mut Option<FxIndexSet<Place<'tcx>>>,
) { ) {
debug!("candidate={:#?}\npats={:#?}", candidate, pats); debug!("candidate={:#?}\npats={:#?}", candidate, pats);
@ -1607,7 +1606,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
// encounter a candidate where the test is not relevant; at // encounter a candidate where the test is not relevant; at
// that point, we stop sorting. // that point, we stop sorting.
while let Some(candidate) = candidates.first_mut() { while let Some(candidate) = candidates.first_mut() {
let Some(idx) = self.sort_candidate(&match_place.clone(), &test, candidate) else { let Some(idx) = self.sort_candidate(&match_place, &test, candidate) else {
break; break;
}; };
let (candidate, rest) = candidates.split_first_mut().unwrap(); let (candidate, rest) = candidates.split_first_mut().unwrap();
@ -1676,7 +1675,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
target_blocks target_blocks
}; };
self.perform_test(span, scrutinee_span, block, match_place, &test, make_target_blocks); self.perform_test(span, scrutinee_span, block, &match_place, &test, make_target_blocks);
} }
/// Determine the fake borrows that are needed from a set of places that /// Determine the fake borrows that are needed from a set of places that

View file

@ -73,8 +73,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
{ {
existing_bindings.extend_from_slice(&new_bindings); existing_bindings.extend_from_slice(&new_bindings);
mem::swap(&mut candidate.bindings, &mut existing_bindings); mem::swap(&mut candidate.bindings, &mut existing_bindings);
candidate.subcandidates = candidate.subcandidates = self.create_or_subcandidates(candidate, &place, pats);
self.create_or_subcandidates(candidate, place.clone(), pats);
return true; return true;
} }
@ -127,7 +126,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
fn create_or_subcandidates<'pat>( fn create_or_subcandidates<'pat>(
&mut self, &mut self,
candidate: &Candidate<'pat, 'tcx>, candidate: &Candidate<'pat, 'tcx>,
place: PlaceBuilder<'tcx>, place: &PlaceBuilder<'tcx>,
pats: &'pat [Box<Pat<'tcx>>], pats: &'pat [Box<Pat<'tcx>>],
) -> Vec<Candidate<'pat, 'tcx>> { ) -> Vec<Candidate<'pat, 'tcx>> {
pats.iter() pats.iter()

View file

@ -150,7 +150,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
match_start_span: Span, match_start_span: Span,
scrutinee_span: Span, scrutinee_span: Span,
block: BasicBlock, block: BasicBlock,
place_builder: PlaceBuilder<'tcx>, place_builder: &PlaceBuilder<'tcx>,
test: &Test<'tcx>, test: &Test<'tcx>,
make_target_blocks: impl FnOnce(&mut Self) -> Vec<BasicBlock>, make_target_blocks: impl FnOnce(&mut Self) -> Vec<BasicBlock>,
) { ) {
@ -727,7 +727,8 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
let downcast_place = match_pair.place.downcast(adt_def, variant_index); // `(x as Variant)` let downcast_place = match_pair.place.downcast(adt_def, variant_index); // `(x as Variant)`
let consequent_match_pairs = subpatterns.iter().map(|subpattern| { let consequent_match_pairs = subpatterns.iter().map(|subpattern| {
// e.g., `(x as Variant).0` // e.g., `(x as Variant).0`
let place = downcast_place.clone().field(subpattern.field, subpattern.pattern.ty); let place = downcast_place
.clone_project(PlaceElem::Field(subpattern.field, subpattern.pattern.ty));
// e.g., `(x as Variant).0 @ P1` // e.g., `(x as Variant).0 @ P1`
MatchPair::new(place, &subpattern.pattern, self) MatchPair::new(place, &subpattern.pattern, self)
}); });

View file

@ -18,7 +18,8 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
subpatterns subpatterns
.iter() .iter()
.map(|fieldpat| { .map(|fieldpat| {
let place = place.clone().field(fieldpat.field, fieldpat.pattern.ty); let place =
place.clone_project(PlaceElem::Field(fieldpat.field, fieldpat.pattern.ty));
MatchPair::new(place, &fieldpat.pattern, self) MatchPair::new(place, &fieldpat.pattern, self)
}) })
.collect() .collect()
@ -45,13 +46,12 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
match_pairs.extend(prefix.iter().enumerate().map(|(idx, subpattern)| { match_pairs.extend(prefix.iter().enumerate().map(|(idx, subpattern)| {
let elem = let elem =
ProjectionElem::ConstantIndex { offset: idx as u64, min_length, from_end: false }; ProjectionElem::ConstantIndex { offset: idx as u64, min_length, from_end: false };
let place = place.clone().project(elem); MatchPair::new(place.clone_project(elem), subpattern, self)
MatchPair::new(place, subpattern, self)
})); }));
if let Some(subslice_pat) = opt_slice { if let Some(subslice_pat) = opt_slice {
let suffix_len = suffix.len() as u64; let suffix_len = suffix.len() as u64;
let subslice = place.clone().project(ProjectionElem::Subslice { let subslice = place.clone_project(PlaceElem::Subslice {
from: prefix.len() as u64, from: prefix.len() as u64,
to: if exact_size { min_length - suffix_len } else { suffix_len }, to: if exact_size { min_length - suffix_len } else { suffix_len },
from_end: !exact_size, from_end: !exact_size,
@ -66,7 +66,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
min_length, min_length,
from_end: !exact_size, from_end: !exact_size,
}; };
let place = place.clone().project(elem); let place = place.clone_project(elem);
MatchPair::new(place, subpattern, self) MatchPair::new(place, subpattern, self)
})); }));
} }